diff options
| author | Jean-Michel Trivi <jmtrivi@google.com> | 2016-04-04 16:06:48 -0700 | 
|---|---|---|
| committer | Jean-Michel Trivi <jmtrivi@google.com> | 2016-04-04 17:25:36 -0700 | 
| commit | e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5 (patch) | |
| tree | a8dc54ef8dba931c72627e7bbebf1844b81a31f7 | |
| parent | ef30836651bf059c3120c03dd11e08b6aafdae13 (diff) | |
| download | fdk-aac-e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5.tar.gz fdk-aac-e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5.tar.bz2 fdk-aac-e1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5.zip | |
SBR/AAC encoder updates, code clean up
* SBR-Encoder
   - Prevent noise level overflow in noise floor detection.
   - Saturate threshold calculation in transient detection.
     Modified file(s):
        libSBRenc/src/nf_est.cpp
        libSBRenc/src/sbr_encoder.cpp
        libSBRenc/src/tran_det.cpp
* AAC-Encoder
   - Expand input data range of GetInvInt() function. There was an encoder
     assert observed in non-default bitrate configuration.
     Modified file(s):
        libAACenc/src/aacenc_lib.cpp
        libAACenc/src/intensity.cpp
        libFDK/include/fixpoint_math.h
        libFDK/src/FDK_core.cpp
        libFDK/src/FDK_tools_rom.cpp
   - Make sure that the encoder is stable with regard to very low audio bandwidth
     confguration parameter value.
   - Fix lowdelay blending for low audio bandwidth.
     Modified file(s):
        libAACenc/src/aacenc.cpp
        libAACenc/src/aacenc_lib.cpp
        libAACenc/src/adj_thr.cpp
        libAACenc/src/psy_configuration.cpp
        libAACenc/src/psy_main.cpp
   - Disable pseudo surround flag in case metadata matrix mixdown index is
     present in program config element.
     Modified file(s):
        libAACenc/src/aacenc_lib.cpp
   - Enable variable bitrate mode in encoder api.
   - Add AACENC_PEAK_BITRATE parameter to encoder api.
   - Add AACENC_AUDIOMUXVER parameter to encoder api.
     Modified file(s):
        libAACenc/include/aacenc_lib.h
        libAACenc/src/aacenc.cpp
        libAACenc/src/aacenc.h
        libAACenc/src/aacenc_lib.cpp
        libAACenc/src/qc_main.cpp
        libMpegTPEnc/src/tpenc_latm.cpp
        libMpegTPEnc/src/version
* FDK-Sources
   - Code clean up. Remove unneeded pseudo audio object types and transport types.
     Modified file(s):
        libAACdec/src/aacdecoder.cpp
        libAACdec/src/aacdecoder_lib.cpp
        libAACenc/include/aacenc_lib.h
        libAACenc/src/aacenc.cpp
        libAACenc/src/aacenc_lib.cpp
        libFDK/src/FDK_tools_rom.cpp
        libMpegTPDec/src/tpdec_lib.cpp
        libMpegTPDec/src/version
        libMpegTPEnc/src/tpenc_latm.cpp
        libMpegTPEnc/src/version
        libSBRdec/src/sbrdecoder.cpp
        libSBRenc/src/sbr_encoder.cpp
        libSYS/include/FDK_audio.h
        libSYS/src/genericStds.cpp
Change-Id: I807a53cb7f48c9ee7563cb8da1d0c52221576ca6
25 files changed, 227 insertions, 215 deletions
| diff --git a/documentation/aacEncoder.pdf b/documentation/aacEncoder.pdfBinary files differ index e8420b1..efb1858 100644 --- a/documentation/aacEncoder.pdf +++ b/documentation/aacEncoder.pdf diff --git a/libAACdec/src/aacdecoder.cpp b/libAACdec/src/aacdecoder.cpp index e19c501..8270f69 100644 --- a/libAACdec/src/aacdecoder.cpp +++ b/libAACdec/src/aacdecoder.cpp @@ -2,7 +2,7 @@  /* -----------------------------------------------------------------------------------------------------------  Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright  1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. +© Copyright  1995 - 2015 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.    All rights reserved.   1.    INTRODUCTION @@ -159,21 +159,6 @@ amm-info@iis.fraunhofer.de -#define CAN_DO_PS(aot) \ -  ((aot) == AOT_AAC_LC \ -|| (aot) == AOT_SBR \ -|| (aot) == AOT_PS \ -|| (aot) == AOT_ER_BSAC \ -|| (aot) == AOT_DRM_AAC) - -#define IS_USAC(aot) \ -  ((aot) == AOT_USAC \ -|| (aot) == AOT_RSVD50) - -#define IS_LOWDELAY(aot) \ -  ((aot) == AOT_ER_AAC_LD \ -|| (aot) == AOT_ER_AAC_ELD) -  void CAacDecoder_SyncQmfMode(HANDLE_AACDECODER self)  { diff --git a/libAACdec/src/aacdecoder_lib.cpp b/libAACdec/src/aacdecoder_lib.cpp index 94eb3c0..b501eb9 100644 --- a/libAACdec/src/aacdecoder_lib.cpp +++ b/libAACdec/src/aacdecoder_lib.cpp @@ -2,7 +2,7 @@  /* -----------------------------------------------------------------------------------------------------------  Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright  1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. +© Copyright  1995 - 2015 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.    All rights reserved.   1.    INTRODUCTION @@ -110,7 +110,7 @@ amm-info@iis.fraunhofer.de  /* Decoder library info */  #define AACDECODER_LIB_VL0 2  #define AACDECODER_LIB_VL1 5 -#define AACDECODER_LIB_VL2 10 +#define AACDECODER_LIB_VL2 11  #define AACDECODER_LIB_TITLE "AAC Decoder Lib"  #ifdef __ANDROID__  #define AACDECODER_LIB_BUILD_DATE "" diff --git a/libAACenc/include/aacenc_lib.h b/libAACenc/include/aacenc_lib.h index 8c0e1cd..828a917 100644 --- a/libAACenc/include/aacenc_lib.h +++ b/libAACenc/include/aacenc_lib.h @@ -2,7 +2,7 @@  /* -----------------------------------------------------------------------------------------------------------  Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright  1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. +© Copyright  1995 - 2015 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.    All rights reserved.   1.    INTRODUCTION @@ -897,11 +897,7 @@ typedef enum                                                          This configuration can be used only with stereo input audio data.                                                    - 23: MPEG-4 AAC Low-Delay.                                                    - 39: MPEG-4 AAC Enhanced Low-Delay. Since there is no ::AUDIO_OBJECT_TYPE for ELD in -                                                        combination with SBR defined, enable SBR explicitely by ::AACENC_SBR_MODE parameter. -                                                  - 129: MPEG-2 AAC Low Complexity. -                                                  - 132: MPEG-2 AAC Low Complexity with Spectral Band Replication (HE-AAC). -                                                  - 156: MPEG-2 AAC Low Complexity with Spectral Band Replication and Parametric Stereo (HE-AAC v2). -                                                         This configuration can be used only with stereo input audio data. */ +                                                        combination with SBR defined, enable SBR explicitely by ::AACENC_SBR_MODE parameter. */    AACENC_BITRATE                  = 0x0101,  /*!< Total encoder bitrate. This parameter is mandatory and interacts with ::AACENC_BITRATEMODE.                                                    - CBR: Bitrate in bits/second. @@ -958,6 +954,16 @@ typedef enum                                                    - 1 to fs/2: Frequency bandwidth in Hertz. (Experts only, better do not                                                                 touch this value to avoid degraded audio quality) */ +  AACENC_PEAK_BITRATE             = 0x0207,  /*!< Peak bitrate configuration parameter to adjust maximum bits per audio frame. Bitrate is in bits/second.  +                                                  The peak bitrate will internally be limited to the chosen bitrate ::AACENC_BITRATE as lower limit +                                                  and the number_of_effective_channels*6144 bit as upper limit. + +                                                  Setting the peak bitrate equal to ::AACENC_BITRATE does not necessarily mean that the audio frames +                                                  will be of constant size. Since the peak bitate is in bits/second, the frame sizes can vary by +                                                  one byte in one or the other direction over various frames. However, it is not recommended to reduce +                                                  the peak pitrate to ::AACENC_BITRATE - it would disable the bitreservoir, which would affect the +                                                  audio quality by a large amount. */ +    AACENC_TRANSMUX                 = 0x0300,  /*!< Transport type to be used. See ::TRANSPORT_TYPE in FDK_audio.h. Following                                                    types can be configured in encoder library:                                                    - 0: raw access units @@ -1023,6 +1029,11 @@ typedef enum                                                    - ADTS: Maximum number of sub frames restricted to 4.                                                    - LOAS/LATM: Maximum number of sub frames restricted to 2.*/ +  AACENC_AUDIOMUXVER              = 0x0304,  /*!< AudioMuxVersion to be used for LATM. (AudioMuxVersionA, currently not implemented): +                                                  - 0: Default, no transmission of tara Buffer fullness, no ASC length and including actual latm Buffer fullnes. +                                                  - 1: Transmission of tara Buffer fullness, ASC length and actual latm Buffer fullness. +                                                  - 2: Transmission of tara Buffer fullness, ASC length and maximum level of latm Buffer fullness. */ +    AACENC_PROTECTION               = 0x0306,  /*!< Configure protection in tranpsort layer:                                                    - 0: No protection. (default)                                                    - 1: CRC active for ADTS bitstream format. */ diff --git a/libAACenc/src/aacenc.cpp b/libAACenc/src/aacenc.cpp index c47e882..5e8c08d 100644 --- a/libAACenc/src/aacenc.cpp +++ b/libAACenc/src/aacenc.cpp @@ -107,6 +107,39 @@ amm-info@iis.fraunhofer.de  #define MIN_BUFSIZE_PER_EFF_CHAN 6144 +INT FDKaacEnc_CalcBitsPerFrame( +        const INT bitRate, +        const INT frameLength, +        const INT samplingRate +        ) +{ +    int shift = 0; +    while ((frameLength & ~((1 << (shift + 1)) - 1)) == frameLength +        && (samplingRate & ~((1 << (shift + 1)) - 1)) == samplingRate) +    { +      shift++; +    } + +    return (bitRate*(frameLength>>shift)) / (samplingRate>>shift); +} + +INT FDKaacEnc_CalcBitrate( +        const INT bitsPerFrame, +        const INT frameLength, +        const INT samplingRate +        ) +{ +    int shift = 0; +    while ((frameLength & ~((1 << (shift + 1)) - 1)) == frameLength +        && (samplingRate & ~((1 << (shift + 1)) - 1)) == samplingRate) +    { +      shift++; +    } + +    return (bitsPerFrame * (samplingRate>>shift)) / ( frameLength>>shift) ; + +} +  static AAC_ENCODER_ERROR FDKaacEnc_InitCheckAncillary(INT bitRate,                                                        INT framelength,                                                        INT ancillaryRate, @@ -220,21 +253,19 @@ INT FDKaacEnc_GetVBRBitrate(INT bitrateMode, CHANNEL_MODE channelMode)  /**   * \brief  Convert encoder bitreservoir value for transport library.   * - * \param bitrateMode           Bitratemode used in current encoder instance. Se ::AACENC_BITRATE_MODE - * \param bitresTotal           Encoder bitreservoir level in bits. + * \param hAacEnc               Encoder handle   *   * \return  Corrected bitreservoir level used in transport library.   */  static INT FDKaacEnc_EncBitresToTpBitres( -        const AACENC_BITRATE_MODE bitrateMode, -        const INT                 bitresTotal +        const HANDLE_AAC_ENC      hAacEnc          )  {    INT transporBitreservoir = 0; -  switch (bitrateMode) { +  switch (hAacEnc->bitrateMode) {      case AACENC_BR_MODE_CBR: -      transporBitreservoir = bitresTotal; /* encoder bitreservoir level */ +      transporBitreservoir = hAacEnc->qcKernel->bitResTot; /* encoder bitreservoir level */        break;      case AACENC_BR_MODE_VBR_1:      case AACENC_BR_MODE_VBR_2: @@ -253,6 +284,10 @@ static INT FDKaacEnc_EncBitresToTpBitres(        FDK_ASSERT(0);    } +  if (hAacEnc->config->audioMuxVersion==2) { +    transporBitreservoir = MIN_BUFSIZE_PER_EFF_CHAN * hAacEnc->channelMapping.nChannelsEff; +  } +    return transporBitreservoir;  } @@ -289,6 +324,7 @@ void FDKaacEnc_AacInitDefaultConfig(AACENC_CONFIG *config)      config->minBitsPerFrame = -1;                   /* minum number of bits in each AU */      config->maxBitsPerFrame = -1;                   /* minum number of bits in each AU */      config->bitreservoir    = -1;                   /* default, uninitialized value */ +    config->audioMuxVersion = -1;                   /* audio mux version not configured */      /* init tabs in fixpoint_math */      InitLdInt(); @@ -564,7 +600,10 @@ AAC_ENCODER_ERROR FDKaacEnc_Initialize(HANDLE_AAC_ENC      hAacEnc,        qcInit.averageBits     = (averageBitsPerFrame+7)&~7;        qcInit.bitRes          = MIN_BUFSIZE_PER_EFF_CHAN*cm->nChannelsEff;        qcInit.maxBits         = MIN_BUFSIZE_PER_EFF_CHAN*cm->nChannelsEff; -      qcInit.minBits         = 0; +      qcInit.maxBits         = (config->maxBitsPerFrame!=-1) ? fixMin(qcInit.maxBits, config->maxBitsPerFrame) : qcInit.maxBits; +      qcInit.maxBits         = fixMax(qcInit.maxBits, (averageBitsPerFrame+7)&~7); +      qcInit.minBits         = (config->minBitsPerFrame!=-1) ? config->minBitsPerFrame : 0; +      qcInit.minBits         = fixMin(qcInit.minBits, averageBitsPerFrame&~7);    }    else    { @@ -575,9 +614,11 @@ AAC_ENCODER_ERROR FDKaacEnc_Initialize(HANDLE_AAC_ENC      hAacEnc,        qcInit.maxBits         = fixMin(MIN_BUFSIZE_PER_EFF_CHAN*cm->nChannelsEff, ((averageBitsPerFrame+7)&~7)+qcInit.bitRes);        qcInit.maxBits         = (config->maxBitsPerFrame!=-1) ? fixMin(qcInit.maxBits, config->maxBitsPerFrame) : qcInit.maxBits; +      qcInit.maxBits         = fixMin(MIN_BUFSIZE_PER_EFF_CHAN*cm->nChannelsEff, fixMax(qcInit.maxBits, (averageBitsPerFrame+7+8)&~7));        qcInit.minBits         = fixMax(0, ((averageBitsPerFrame-1)&~7)-qcInit.bitRes-transportEnc_GetStaticBits(hTpEnc, ((averageBitsPerFrame+7)&~7)+qcInit.bitRes));        qcInit.minBits         = (config->minBitsPerFrame!=-1) ? fixMax(qcInit.minBits, config->minBitsPerFrame) : qcInit.minBits; +      qcInit.minBits         = fixMin(qcInit.minBits, (averageBitsPerFrame - transportEnc_GetStaticBits(hTpEnc, qcInit.maxBits))&~7);    }    qcInit.sampleRate          = config->sampleRate; @@ -585,11 +626,9 @@ AAC_ENCODER_ERROR FDKaacEnc_Initialize(HANDLE_AAC_ENC      hAacEnc,    qcInit.nSubFrames          = config->nSubFrames;    qcInit.padding.paddingRest = config->sampleRate; -  /* Calc meanPe */ -  bw_ratio = fDivNorm((FIXP_DBL)hAacEnc->bandwidth90dB, (FIXP_DBL)(config->sampleRate>>1), &qbw); -  qbw = DFRACT_BITS-1-qbw; -  /* qcInit.meanPe = 10.0f * FRAME_LEN_LONG * hAacEnc->bandwidth90dB/(config->sampleRate/2.0f); */ -  qcInit.meanPe = fMult(bw_ratio, (FIXP_DBL)((10*config->framelength)<<16)) >> (qbw-15); +  /* Calc meanPe: qcInit.meanPe = 10.0f * FRAME_LEN_LONG * hAacEnc->bandwidth90dB/(config->sampleRate/2.0f); */ +  bw_ratio = fDivNorm((FIXP_DBL)(10*config->framelength*hAacEnc->bandwidth90dB), (FIXP_DBL)(config->sampleRate), &qbw); +  qcInit.meanPe = FDKmax((INT)scaleValue(bw_ratio, qbw+1-(DFRACT_BITS-1)), 1);    /* Calc maxBitFac */    mbfac = fDivNorm((MIN_BUFSIZE_PER_EFF_CHAN-744)*cm->nChannelsEff, qcInit.averageBits/qcInit.nSubFrames, &qmbfac); @@ -651,23 +690,7 @@ AAC_ENCODER_ERROR FDKaacEnc_Initialize(HANDLE_AAC_ENC      hAacEnc,    if (ErrorStatus != AAC_ENC_OK)      goto bail; -  /* Map virtual aot's to intern aot used in bitstream writer. */ -  switch (hAacEnc->config->audioObjectType) { -    case AOT_MP2_AAC_LC: -    case AOT_DABPLUS_AAC_LC: -      hAacEnc->aot = AOT_AAC_LC; -      break; -    case AOT_MP2_SBR: -    case AOT_DABPLUS_SBR: -      hAacEnc->aot = AOT_SBR; -      break; -    case AOT_MP2_PS: -    case AOT_DABPLUS_PS: -      hAacEnc->aot = AOT_PS; -      break; -    default: -      hAacEnc->aot = hAacEnc->config->audioObjectType; -  } +  hAacEnc->aot = hAacEnc->config->audioObjectType;    /* common things */ @@ -932,7 +955,7 @@ AAC_ENCODER_ERROR FDKaacEnc_EncodeFrame( HANDLE_AAC_ENC       hAacEnc,                transportEnc_WriteAccessUnit(                      hTpEnc,                      totalBits, -                    FDKaacEnc_EncBitresToTpBitres(hAacEnc->bitrateMode, hAacEnc->qcKernel->bitResTot), +                    FDKaacEnc_EncBitresToTpBitres(hAacEnc),                      cm->nChannelsEff);                /* write bitstream */ diff --git a/libAACenc/src/aacenc.h b/libAACenc/src/aacenc.h index 87fc3e8..61520de 100644 --- a/libAACenc/src/aacenc.h +++ b/libAACenc/src/aacenc.h @@ -2,7 +2,7 @@  /* -----------------------------------------------------------------------------------------------------------  Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright  1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. +© Copyright  1995 - 2015 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.    All rights reserved.   1.    INTRODUCTION @@ -204,6 +204,8 @@ struct AACENC_CONFIG {    INT   maxBitsPerFrame;        /* maximum number of bits in AU */    INT   bitreservoir;           /* size of bitreservoir */ +  INT   audioMuxVersion;        /* audio mux version in loas/latm transport format */ +    UINT  sbrRatio;               /* sbr sampling rate ratio: dual- or single-rate */    UCHAR useTns;                 /* flag: use temporal noise shaping */ @@ -223,6 +225,36 @@ typedef struct {  typedef struct AAC_ENC *HANDLE_AAC_ENC;  /** + * \brief Calculate framesize in bits for given bit rate, frame length and sampling rate. + * + * \param bitRate               Ttarget bitrate in bits per second. + * \param frameLength           Number of audio samples in one frame. + * \param samplingRate          Sampling rate in Hz. + * + * \return                      Framesize in bits per frame. +*/ +INT FDKaacEnc_CalcBitsPerFrame( +        const INT bitRate, +        const INT frameLength, +        const INT samplingRate +        ); + +/** + * \brief Calculate bitrate in bits per second for given framesize, frame length and sampling rate. + * + * \param bitsPerFrame          Framesize in bits per frame. + * \param frameLength           Number of audio samples in one frame. + * \param samplingRate          Sampling rate in Hz. + * + * \return                      Bitrate in bits per second. +*/ +INT FDKaacEnc_CalcBitrate( +        const INT bitsPerFrame, +        const INT frameLength, +        const INT samplingRate +        ); + +/**   * \brief Limit given bit rate to a valid value   * \param hTpEnc transport encoder handle   * \param coreSamplingRate the sample rate to be used for the AAC encoder diff --git a/libAACenc/src/aacenc_lib.cpp b/libAACenc/src/aacenc_lib.cpp index 02f83bf..9a3b214 100644 --- a/libAACenc/src/aacenc_lib.cpp +++ b/libAACenc/src/aacenc_lib.cpp @@ -98,7 +98,7 @@ amm-info@iis.fraunhofer.de  /* Encoder library info */  #define AACENCODER_LIB_VL0 3  #define AACENCODER_LIB_VL1 4 -#define AACENCODER_LIB_VL2 14 +#define AACENCODER_LIB_VL2 19  #define AACENCODER_LIB_TITLE "AAC Encoder"  #ifdef __ANDROID__  #define AACENCODER_LIB_BUILD_DATE "" @@ -153,6 +153,7 @@ typedef struct {      UINT              userAfterburner;      UINT              userFramelength;      UINT              userAncDataRate; +    UINT              userPeakBitrate;      UCHAR             userTns;               /*!< Use TNS coding. */      UCHAR             userPns;               /*!< Use PNS coding. */ @@ -326,10 +327,7 @@ static inline INT isSbrActive(const HANDLE_AACENC_CONFIG hAacConfig)  {      INT sbrUsed = 0; -    if ( (hAacConfig->audioObjectType==AOT_SBR)         || (hAacConfig->audioObjectType==AOT_PS) -      || (hAacConfig->audioObjectType==AOT_MP2_SBR)     || (hAacConfig->audioObjectType==AOT_MP2_PS) -      || (hAacConfig->audioObjectType==AOT_DABPLUS_SBR) || (hAacConfig->audioObjectType==AOT_DABPLUS_PS) -      || (hAacConfig->audioObjectType==AOT_DRM_SBR)     || (hAacConfig->audioObjectType==AOT_DRM_MPEG_PS) ) +    if ( (hAacConfig->audioObjectType==AOT_SBR) || (hAacConfig->audioObjectType==AOT_PS) )      {          sbrUsed = 1;      } @@ -345,10 +343,7 @@ static inline INT isPsActive(const AUDIO_OBJECT_TYPE audioObjectType)  {      INT psUsed = 0; -    if ( (audioObjectType==AOT_PS) -      || (audioObjectType==AOT_MP2_PS) -      || (audioObjectType==AOT_DABPLUS_PS) -      || (audioObjectType==AOT_DRM_MPEG_PS) ) +    if ( (audioObjectType==AOT_PS) )      {          psUsed = 1;      } @@ -373,8 +368,7 @@ static SBR_PS_SIGNALING getSbrSignalingMode(      sbrSignaling = SIG_IMPLICIT; /* default: implicit signaling */    } -  if ((audioObjectType==AOT_AAC_LC)     || (audioObjectType==AOT_SBR)     || (audioObjectType==AOT_PS)    || -      (audioObjectType==AOT_MP2_AAC_LC) || (audioObjectType==AOT_MP2_SBR) || (audioObjectType==AOT_MP2_PS) ) { +  if ( (audioObjectType==AOT_AAC_LC) || (audioObjectType==AOT_SBR) || (audioObjectType==AOT_PS) ) {      switch (transportType) {        case TT_MP4_ADIF:        case TT_MP4_ADTS: @@ -430,22 +424,7 @@ static void FDKaacEnc_MapConfig(    cc->flags = 0; -  /* Map virtual aot to transport aot. */ -  switch (hAacConfig->audioObjectType) { -    case AOT_MP2_AAC_LC: -      transport_AOT = AOT_AAC_LC; -      break; -    case AOT_MP2_SBR: -      transport_AOT = AOT_SBR; -      cc->flags |= CC_SBR; -     break; -    case AOT_MP2_PS: -      transport_AOT = AOT_PS; -      cc->flags |= CC_SBR; -      break; -    default: -      transport_AOT = hAacConfig->audioObjectType; -  } +  transport_AOT = hAacConfig->audioObjectType;    if (hAacConfig->audioObjectType == AOT_ER_AAC_ELD) {      cc->flags |= (hAacConfig->syntaxFlags & AC_SBR_PRESENT) ? CC_SBR : 0; @@ -511,16 +490,7 @@ static void FDKaacEnc_MapConfig(    cc->samplingRate    = hAacConfig->sampleRate;    /* Mpeg-4 signaling for transport library. */ -  switch ( hAacConfig->audioObjectType ) { -    case AOT_MP2_AAC_LC: -    case AOT_MP2_SBR: -    case AOT_MP2_PS: -      cc->flags &= ~CC_MPEG_ID; /* Required for ADTS. */ -      cc->extAOT = AOT_NULL_OBJECT; -      break; -    default: -      cc->flags |= CC_MPEG_ID; -  } +  cc->flags |= CC_MPEG_ID;    /* ER-tools signaling. */    cc->flags     |= (hAacConfig->syntaxFlags & AC_ER_VCB11) ? CC_VCB11 : 0; @@ -585,6 +555,7 @@ AAC_ENCODER_ERROR aacEncDefaultConfig(HANDLE_AACENC_CONFIG hAacConfig,      config->userChannelMode = hAacConfig->channelMode;      config->userBitrate     = hAacConfig->bitRate;      config->userBitrateMode = hAacConfig->bitrateMode; +    config->userPeakBitrate = (UINT)-1;      config->userBandwidth   = hAacConfig->bandWidth;      config->userTns         = hAacConfig->useTns;      config->userPns         = hAacConfig->usePns; @@ -792,12 +763,15 @@ AACENC_ERROR FDKaacEnc_AdjustEncSettings(HANDLE_AACENCODER hAacEncoder,      hAacConfig->syntaxFlags     = 0;      hAacConfig->epConfig        = -1; +    if (config->userTpType==TT_MP4_LATM_MCP1 || config->userTpType==TT_MP4_LATM_MCP0 || config->userTpType==TT_MP4_LOAS) { +      hAacConfig->audioMuxVersion = config->userTpAmxv; +    } +    else { +      hAacConfig->audioMuxVersion = -1; +    } +      /* Adapt internal AOT when necessary. */      switch ( hAacConfig->audioObjectType ) { -      case AOT_MP2_AAC_LC: -      case AOT_MP2_SBR: -      case AOT_MP2_PS: -          hAacConfig->usePns = 0;        case AOT_AAC_LC:        case AOT_SBR:        case AOT_PS: @@ -884,6 +858,18 @@ AACENC_ERROR FDKaacEnc_AdjustEncSettings(HANDLE_AACENCODER hAacEncoder,          }      } +    if ((hAacConfig->bitrateMode >= 0) && (hAacConfig->bitrateMode <= 5)) { +      if ((INT)config->userPeakBitrate != -1) { +        hAacConfig->maxBitsPerFrame = (FDKaacEnc_CalcBitsPerFrame(fMax(hAacConfig->bitRate, (INT)config->userPeakBitrate), hAacConfig->framelength, hAacConfig->sampleRate) + 7)&~7; +      } +      else { +        hAacConfig->maxBitsPerFrame = -1; +      } +      if (hAacConfig->audioMuxVersion==2) { +        hAacConfig->minBitsPerFrame = fMin(32*8, FDKaacEnc_CalcBitsPerFrame(hAacConfig->bitRate, hAacConfig->framelength, hAacConfig->sampleRate))&~7; +      } +    } +      /* Initialize SBR parameters */      if ( (hAacConfig->audioObjectType==AOT_ER_AAC_ELD)        && (config->userSbrEnabled == (UCHAR)-1) && (config->userSbrRatio==0) ) @@ -1139,7 +1125,7 @@ static AACENC_ERROR aacEncInit(HANDLE_AACENCODER  hAacEncoder,                  hAacConfig);          /* create flags for transport encoder */ -        if (config->userTpAmxv == 1) { +        if (config->userTpAmxv != 0) {              flags |= TP_FLAG_LATM_AMV;          }          /* Clear output buffer */ @@ -1569,7 +1555,7 @@ AACENC_ERROR aacEncEncode(            && ((hAacEncoder->extParam.userChannelMode==MODE_1_2_2)||(hAacEncoder->extParam.userChannelMode==MODE_1_2_2_1)) )          {            /* Set matrix mixdown coefficient. */ -          UINT pceValue = (UINT)( (1<<3) | ((matrix_mixdown_idx&0x3)<<1) | 1 ); +          UINT pceValue = (UINT)( (0<<3) | ((matrix_mixdown_idx&0x3)<<1) | 1 );            if (hAacEncoder->extParam.userPceAdditions != pceValue) {              hAacEncoder->extParam.userPceAdditions = pceValue;              hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT; @@ -1785,19 +1771,16 @@ AACENC_ERROR aacEncoder_SetParam(              /* check if AOT matches the allocated modules */              switch ( value ) {                case AOT_PS: -              case AOT_MP2_PS:                  if (!(hAacEncoder->encoder_modis & (ENC_MODE_FLAG_PS))) {                    err = AACENC_INVALID_CONFIG;                    goto bail;                  }                case AOT_SBR: -              case AOT_MP2_SBR:                  if (!(hAacEncoder->encoder_modis & (ENC_MODE_FLAG_SBR))) {                    err = AACENC_INVALID_CONFIG;                    goto bail;                  }                case AOT_AAC_LC: -              case AOT_MP2_AAC_LC:                case AOT_ER_AAC_LD:                case AOT_ER_AAC_ELD:                  if (!(hAacEncoder->encoder_modis & (ENC_MODE_FLAG_AAC))) { @@ -1823,6 +1806,7 @@ AACENC_ERROR aacEncoder_SetParam(          if (settings->userBitrateMode != value) {              switch ( value ) {                case 0: +              case 1: case 2: case 3: case 4: case 5:                case 8:                  settings->userBitrateMode = value;                  hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_TRANSPORT; @@ -1973,6 +1957,16 @@ AACENC_ERROR aacEncoder_SetParam(              hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT;          }          break; +    case AACENC_AUDIOMUXVER: +        if (settings->userTpAmxv != value) { +            if ( !((value==0) || (value==1) || (value==2)) ) { +                err = AACENC_INVALID_CONFIG; +                break; +            } +            settings->userTpAmxv = value; +            hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT; +        } +        break;      case AACENC_TPSUBFRAMES:          if (settings->userTpNsubFrames != value) {              if (! ( (value>=1) && (value<=4) ) ) { @@ -2006,6 +2000,12 @@ AACENC_ERROR aacEncoder_SetParam(              hAacEncoder->InitFlags |= AACENC_INIT_CONFIG;          }          break; +    case AACENC_PEAK_BITRATE: +        if (settings->userPeakBitrate != value) { +            settings->userPeakBitrate = value; +            hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_TRANSPORT; +        } +        break;      default:        err = AACENC_UNSUPPORTED_PARAMETER;        break; @@ -2076,6 +2076,9 @@ UINT aacEncoder_GetParam(      case AACENC_HEADER_PERIOD:          value = (UINT)hAacEncoder->coderConfig.headerPeriod;          break; +    case AACENC_AUDIOMUXVER: +        value = (UINT)hAacEncoder->aacConfig.audioMuxVersion; +        break;      case AACENC_TPSUBFRAMES:          value = (UINT)settings->userTpNsubFrames;          break; @@ -2088,6 +2091,12 @@ UINT aacEncoder_GetParam(      case AACENC_METADATA_MODE:          value = (hAacEncoder->metaDataAllowed==0) ? 0 : (UINT)settings->userMetaDataMode;          break; +    case AACENC_PEAK_BITRATE: +        value = (UINT)-1; /* peak bitrate parameter is meaningless */ +        if ( ((INT)hAacEncoder->extParam.userPeakBitrate!=-1) ) { +          value = (UINT)(fMax((INT)hAacEncoder->extParam.userPeakBitrate, hAacEncoder->aacConfig.bitRate)); /* peak bitrate parameter is in use */ +        } +        break;      default:        //err = MPS_INVALID_PARAMETER;        break; diff --git a/libAACenc/src/adj_thr.cpp b/libAACenc/src/adj_thr.cpp index 69a70b4..c318843 100644 --- a/libAACenc/src/adj_thr.cpp +++ b/libAACenc/src/adj_thr.cpp @@ -2138,7 +2138,7 @@ static FIXP_DBL FDKaacEnc_bitresCalcBitFac(const INT       bitresBits,          bresParam->clipSpendLow, bresParam->clipSpendHigh,          bresParam->minBitSpend, bresParam->maxBitSpend, bitspend_slope); -    pe_pers = fDivNorm(pex - adjThrChan->peMin, adjThrChan->peMax - adjThrChan->peMin); +    pe_pers = (pex > adjThrChan->peMin) ? fDivNorm(pex - adjThrChan->peMin, adjThrChan->peMax - adjThrChan->peMin) : 0;      tmp_fix = fMult(((FIXP_DBL)bitSpend + (FIXP_DBL)bitSave), pe_pers);      bitresFac_fix = (UNITY>>1) - ((FIXP_DBL)bitSave>>1) + (tmp_fix>>1); qbres = (DFRACT_BITS-2); diff --git a/libAACenc/src/intensity.cpp b/libAACenc/src/intensity.cpp index 6d807f7..b45b27b 100644 --- a/libAACenc/src/intensity.cpp +++ b/libAACenc/src/intensity.cpp @@ -2,7 +2,7 @@  /* -----------------------------------------------------------------------------------------------------------  Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright  1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. +© Copyright  1995 - 2015 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.    All rights reserved.   1.    INTRODUCTION @@ -325,7 +325,6 @@ FDKaacEnc_prepareIntensityDecision(const FIXP_DBL    *sfbEnergyLeft,        channelCorr[sfb + sfboffs] = FL2FXCONST_DBL(0.0f); -      FDK_ASSERT(50 >= 49);        /* max width of scalefactorband is 96; width's are always even */        /* inv_n is scaled with factor 2 to compensate fMultDiv2() in subsequent loops */        inv_n = GetInvInt((sfbOffset[sfb + sfboffs + 1] - sfbOffset[sfb + sfboffs])>>1); diff --git a/libAACenc/src/psy_configuration.cpp b/libAACenc/src/psy_configuration.cpp index 4393fa1..9a72c68 100644 --- a/libAACenc/src/psy_configuration.cpp +++ b/libAACenc/src/psy_configuration.cpp @@ -2,7 +2,7 @@  /* -----------------------------------------------------------------------------------------------------------  Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright  1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. +© Copyright  1995 - 2015 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.    All rights reserved.   1.    INTRODUCTION @@ -634,13 +634,14 @@ AAC_ENCODER_ERROR FDKaacEnc_InitPsyConfiguration(INT   bitrate,          if (psyConf->sfbOffset[sfb] >= psyConf->lowpassLine)              break;      } -    psyConf->sfbActive = sfb; +    psyConf->sfbActive = FDKmax(sfb, 1);      for (sfb = 0; sfb < psyConf->sfbCnt; sfb++){          if (psyConf->sfbOffset[sfb] >= psyConf->lowpassLineLFE)              break;      }      psyConf->sfbActiveLFE = sfb; +    psyConf->sfbActive = FDKmax(psyConf->sfbActive, psyConf->sfbActiveLFE);      /* calculate minSnr */      FDKaacEnc_initMinSnr(bitrate, diff --git a/libAACenc/src/psy_main.cpp b/libAACenc/src/psy_main.cpp index 1c593f8..3cc9438 100644 --- a/libAACenc/src/psy_main.cpp +++ b/libAACenc/src/psy_main.cpp @@ -621,7 +621,7 @@ AAC_ENCODER_ERROR FDKaacEnc_psyMain(INT                 channels,            FDKmemclear(&psyData[ch]->mdctSpectrum[psyData[ch]->lowpassLine+wOffset],                        (windowLength[ch]-psyData[ch]->lowpassLine)*sizeof(FIXP_DBL)); -          if (hPsyConfLong->filterbank != FB_LC) { +          if ( (hPsyConfLong->filterbank != FB_LC) && (psyData[ch]->lowpassLine >= FADE_OUT_LEN) ) {              /* Do blending to reduce gibbs artifacts */              for (int i=0; i<FADE_OUT_LEN; i++) {                psyData[ch]->mdctSpectrum[psyData[ch]->lowpassLine+wOffset - FADE_OUT_LEN + i] = fMult(psyData[ch]->mdctSpectrum[psyData[ch]->lowpassLine+wOffset - FADE_OUT_LEN + i], fadeOutFactor[i]); diff --git a/libAACenc/src/qc_main.cpp b/libAACenc/src/qc_main.cpp index 278bcb2..7503309 100644 --- a/libAACenc/src/qc_main.cpp +++ b/libAACenc/src/qc_main.cpp @@ -1248,6 +1248,8 @@ AAC_ENCODER_ERROR FDKaacEnc_updateFillBits(CHANNEL_MAPPING*          cm,      case QCDATA_BR_MODE_VBR_4:      case QCDATA_BR_MODE_VBR_5:        qcOut[0]->totFillBits = (qcOut[0]->grantedDynBits - qcOut[0]->usedDynBits)&7; /* precalculate alignment bits */ +      qcOut[0]->totalBits = qcOut[0]->staticBits + qcOut[0]->usedDynBits + qcOut[0]->totFillBits + qcOut[0]->elementExtBits + qcOut[0]->globalExtBits; +      qcOut[0]->totFillBits += ( fixMax(0, qcKernel->minBitsPerFrame - qcOut[0]->totalBits) + 7) & ~7;        break;      case QCDATA_BR_MODE_CBR: @@ -1257,6 +1259,8 @@ AAC_ENCODER_ERROR FDKaacEnc_updateFillBits(CHANNEL_MAPPING*          cm,        /* processing fill-bits */        INT deltaBitRes = qcOut[0]->grantedDynBits - qcOut[0]->usedDynBits ;        qcOut[0]->totFillBits = fixMax((deltaBitRes&7), (deltaBitRes - (fixMax(0,bitResSpace-7)&~7))); +      qcOut[0]->totalBits = qcOut[0]->staticBits + qcOut[0]->usedDynBits + qcOut[0]->totFillBits + qcOut[0]->elementExtBits + qcOut[0]->globalExtBits; +      qcOut[0]->totFillBits += ( fixMax(0, qcKernel->minBitsPerFrame - qcOut[0]->totalBits) + 7) & ~7;        break;    } /* switch (qcKernel->bitrateMode) */ diff --git a/libFDK/include/fixpoint_math.h b/libFDK/include/fixpoint_math.h index df141d3..88e2f09 100644 --- a/libFDK/include/fixpoint_math.h +++ b/libFDK/include/fixpoint_math.h @@ -2,7 +2,7 @@  /* -----------------------------------------------------------------------------------------------------------  Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright  1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. +© Copyright  1995 - 2015 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.    All rights reserved.   1.    INTRODUCTION @@ -438,11 +438,11 @@ inline FIXP_DBL fAddSaturate(const FIXP_DBL a, const FIXP_DBL b)  /***************************************************************************** - array for 1/n, n=1..50 + array for 1/n, n=1..80  ****************************************************************************/ -  extern const FIXP_DBL invCount[50]; +  extern const FIXP_DBL invCount[80];    LNK_SECTION_INITCODE    inline void InitInvInt(void) {} @@ -450,14 +450,14 @@ inline FIXP_DBL fAddSaturate(const FIXP_DBL a, const FIXP_DBL b)  /**   * \brief Calculate the value of 1/i where i is a integer value. It supports - *        input values from 1 upto 50. + *        input values from 1 upto 80.   * \param intValue Integer input value.   * \param FIXP_DBL representation of 1/intValue   */  inline FIXP_DBL GetInvInt(int intValue)  { -  FDK_ASSERT((intValue > 0) && (intValue < 50)); -  FDK_ASSERT(intValue<50); +  FDK_ASSERT((intValue > 0) && (intValue < 80)); +  FDK_ASSERT(intValue<80);  	return invCount[intValue];  } diff --git a/libFDK/src/FDK_core.cpp b/libFDK/src/FDK_core.cpp index cccb925..8fa5596 100644 --- a/libFDK/src/FDK_core.cpp +++ b/libFDK/src/FDK_core.cpp @@ -93,7 +93,7 @@ amm-info@iis.fraunhofer.de  /* FDK tools library info */  #define FDK_TOOLS_LIB_VL0 2  #define FDK_TOOLS_LIB_VL1 3 -#define FDK_TOOLS_LIB_VL2 3 +#define FDK_TOOLS_LIB_VL2 4  #define FDK_TOOLS_LIB_TITLE "FDK Tools"  #ifdef __ANDROID__  #define FDK_TOOLS_LIB_BUILD_DATE "" diff --git a/libFDK/src/FDK_tools_rom.cpp b/libFDK/src/FDK_tools_rom.cpp index c6e517e..49f0ee1 100644 --- a/libFDK/src/FDK_tools_rom.cpp +++ b/libFDK/src/FDK_tools_rom.cpp @@ -2,7 +2,7 @@  /* -----------------------------------------------------------------------------------------------------------  Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright  1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. +© Copyright  1995 - 2015 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.    All rights reserved.   1.    INTRODUCTION @@ -1902,7 +1902,7 @@ const USHORT sqrt_tab[49]={  0xb504};  LNK_SECTION_CONSTDATA_L1 -const FIXP_DBL invCount[50]=  /* This could be 16-bit wide */ +const FIXP_DBL invCount[80]=  /* This could be 16-bit wide */  {      0x00000000, 0x7fffffff, 0x40000000, 0x2aaaaaab, 0x20000000,      0x1999999a, 0x15555555, 0x12492492, 0x10000000, 0x0e38e38e, @@ -1913,7 +1913,13 @@ const FIXP_DBL invCount[50]=  /* This could be 16-bit wide */      0x04444444, 0x04210842, 0x04000000, 0x03e0f83e, 0x03c3c3c4,      0x03a83a84, 0x038e38e4, 0x03759f23, 0x035e50d8, 0x03483483,      0x03333333, 0x031f3832, 0x030c30c3, 0x02fa0be8, 0x02e8ba2f, -    0x02d82d83, 0x02c8590b, 0x02b93105, 0x02aaaaab, 0x029cbc15 +    0x02d82d83, 0x02c8590b, 0x02b93105, 0x02aaaaab, 0x029cbc15, +    0x028f5c29, 0x02828283, 0x02762762, 0x026a439f, 0x025ed098, +    0x0253c825, 0x02492492, 0x023ee090, 0x0234f72c, 0x022b63cc, +    0x02222222, 0x02192e2a, 0x02108421, 0x02082082, 0x02000000, +    0x01f81f82, 0x01f07c1f, 0x01e9131b, 0x01e1e1e2, 0x01dae607, +    0x01d41d42, 0x01cd8569, 0x01c71c72, 0x01c0e070, 0x01bacf91, +    0x01b4e81b, 0x01af286c, 0x01a98ef6, 0x01a41a42, 0x019ec8e9  }; @@ -2033,19 +2039,6 @@ static const element_list_t node_aac_cpe = {    { &node_aac_cpe0, &node_aac_cpe1 }  }; -#define el_mpegsres_sce &el_aac_sce[2] - -static const element_list_t node_mpegsres_sce = { -  el_mpegsres_sce, -  { NULL, NULL } -}; - -static const element_list_t node_mpegsres_cpe = { -  el_aac_cpe1, -  { NULL, NULL } -}; - -  /*   * AOT C- {17,23}   * epConfig = 0,1 @@ -2424,13 +2417,6 @@ const element_list_t * getBitstreamElementList(AUDIO_OBJECT_TYPE aot, SCHAR epCo          else            return &node_eld_cpe_epc1;        } -    case AOT_MPEGS_RESIDUALS: -      if (nChannels == 1) { -        return &node_mpegsres_sce; -      } else { -        return &node_mpegsres_cpe; -      } -      break;      default:        break;    } diff --git a/libMpegTPDec/src/tpdec_lib.cpp b/libMpegTPDec/src/tpdec_lib.cpp index 445615d..950af64 100644 --- a/libMpegTPDec/src/tpdec_lib.cpp +++ b/libMpegTPDec/src/tpdec_lib.cpp @@ -2,7 +2,7 @@  /* -----------------------------------------------------------------------------------------------------------  Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright  1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. +© Copyright  1995 - 2015 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.    All rights reserved.   1.    INTRODUCTION @@ -1100,7 +1100,6 @@ TRANSPORTDEC_ERROR transportDec_ReadAccessUnit( const HANDLE_TRANSPORTDEC hTp, c        }        break; -    case TT_RSVD50:      case TT_MP4_ADTS:      case TT_MP4_LOAS:        err = transportDec_readStream(hTp, layer); diff --git a/libMpegTPDec/src/version b/libMpegTPDec/src/version index fc7e5f0..18fc9ba 100644 --- a/libMpegTPDec/src/version +++ b/libMpegTPDec/src/version @@ -2,7 +2,7 @@  /* library info */  #define TP_LIB_VL0 2  #define TP_LIB_VL1 3 -#define TP_LIB_VL2 4 +#define TP_LIB_VL2 5  #define TP_LIB_TITLE "MPEG Transport"  #ifdef __ANDROID__  #define TP_LIB_BUILD_DATE "" diff --git a/libMpegTPEnc/src/tpenc_latm.cpp b/libMpegTPEnc/src/tpenc_latm.cpp index 58e51ef..f292019 100644 --- a/libMpegTPEnc/src/tpenc_latm.cpp +++ b/libMpegTPEnc/src/tpenc_latm.cpp @@ -2,7 +2,7 @@  /* -----------------------------------------------------------------------------------------------------------  Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright  1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. +© Copyright  1995 - 2015 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.    All rights reserved.   1.    INTRODUCTION @@ -296,6 +296,7 @@ CreateStreamMuxConfig(    USHORT coreFrameOffset=0; +  hAss->taraBufferFullness  = 0xFF;    hAss->audioMuxVersionA    = 0; /* for future extensions */    hAss->streamMuxConfigBits = 0; @@ -339,13 +340,7 @@ CreateStreamMuxConfig(              hAss->streamMuxConfigBits+=1;            }            if( (useSameConfig == 0) || (transLayer==0) ) { -            UINT bits; - -            if ( hAss->audioMuxVersion == 1 ) { -              FDKpushFor(hBs, 2); /* align to ASC, even if we do not know the length of the "ascLen" field yet */ -            } - -            bits = FDKgetValidBits( hBs ); +            const UINT alignAnchor = FDKgetValidBits(hBs);              transportEnc_writeASC(                      hBs, @@ -353,19 +348,24 @@ CreateStreamMuxConfig(                      cb                      ); -            bits = FDKgetValidBits( hBs ) - bits; -              if ( hAss->audioMuxVersion == 1 ) { -              FDKpushBack(hBs, bits+2); -              hAss->streamMuxConfigBits += transportEnc_LatmWriteValue( hBs, bits ); +              UINT ascLen = transportEnc_LatmWriteValue(hBs, 0); +              FDKbyteAlign(hBs, alignAnchor); +              ascLen = FDKgetValidBits(hBs) - alignAnchor - ascLen; +              FDKpushBack(hBs, FDKgetValidBits(hBs) - alignAnchor); + +              transportEnc_LatmWriteValue(hBs, ascLen); +                transportEnc_writeASC(                        hBs,                        hAss->config[prog][layer],                        cb                        ); + +              FDKbyteAlign(hBs, alignAnchor); /* asc length fillbits */              } -            hAss->streamMuxConfigBits += bits; /* add asc length to smc summary */ +            hAss->streamMuxConfigBits += FDKgetValidBits(hBs) - alignAnchor; /* add asc length to smc summary */            }            transLayer++; @@ -384,7 +384,6 @@ CreateStreamMuxConfig(            case AOT_ER_AAC_LD     :            case AOT_ER_AAC_ELD    :            case AOT_USAC: -          case AOT_RSVD50:              p_linfo->frameLengthType = 0;              FDKwriteBits( hBs, p_linfo->frameLengthType, 3 );                        /* frameLengthType */ diff --git a/libMpegTPEnc/src/version b/libMpegTPEnc/src/version index fc7e5f0..8742568 100644 --- a/libMpegTPEnc/src/version +++ b/libMpegTPEnc/src/version @@ -2,7 +2,7 @@  /* library info */  #define TP_LIB_VL0 2  #define TP_LIB_VL1 3 -#define TP_LIB_VL2 4 +#define TP_LIB_VL2 6  #define TP_LIB_TITLE "MPEG Transport"  #ifdef __ANDROID__  #define TP_LIB_BUILD_DATE "" diff --git a/libSBRdec/src/sbrdecoder.cpp b/libSBRdec/src/sbrdecoder.cpp index 619e4fd..e15145a 100644 --- a/libSBRdec/src/sbrdecoder.cpp +++ b/libSBRdec/src/sbrdecoder.cpp @@ -2,7 +2,7 @@  /* -----------------------------------------------------------------------------------------------------------  Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright  1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. +© Copyright  1995 - 2015 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.    All rights reserved.   1.    INTRODUCTION @@ -137,7 +137,7 @@ amm-info@iis.fraunhofer.de  /* Decoder library info */  #define SBRDECODER_LIB_VL0 2  #define SBRDECODER_LIB_VL1 2 -#define SBRDECODER_LIB_VL2 6 +#define SBRDECODER_LIB_VL2 7  #define SBRDECODER_LIB_TITLE "SBR Decoder"  #ifdef __ANDROID__  #define SBRDECODER_LIB_BUILD_DATE "" @@ -318,7 +318,6 @@ SBR_ERROR sbrDecoder_ResetElement (      case AOT_PS:      case AOT_ER_AAC_SCAL:      case AOT_DRM_AAC: -    case AOT_DRM_SURROUND:        if (CreatePsDec ( &self->hParametricStereoDec, samplesPerFrame )) {          sbrError = SBRDEC_CREATE_ERROR;          goto bail; @@ -503,7 +502,6 @@ SBR_ERROR sbrDecoder_InitElement (          case AOT_PS:          case AOT_ER_AAC_SCAL:          case AOT_DRM_AAC: -        case AOT_DRM_SURROUND:            elChannels = 2;            break;          default: diff --git a/libSBRenc/src/nf_est.cpp b/libSBRenc/src/nf_est.cpp index 7a3c022..385a043 100644 --- a/libSBRenc/src/nf_est.cpp +++ b/libSBRenc/src/nf_est.cpp @@ -2,7 +2,7 @@  /* -----------------------------------------------------------------------------------------------------------  Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright  1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. +© Copyright  1995 - 2015 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.    All rights reserved.   1.    INTRODUCTION @@ -268,8 +268,9 @@ qmfBasedNoiseFloorDetection(FIXP_DBL *noiseLevel,              /*!< Pointer to v    /*     * Add a noise floor offset to compensate for bias in the detector     *****************************************************************/ -  if(!missingHarmonicFlag) -    *noiseLevel = fMult(*noiseLevel, noiseFloorOffset)<<(NOISE_FLOOR_OFFSET_SCALING); +  if(!missingHarmonicFlag) { +    *noiseLevel = fixMin(fMult(*noiseLevel, noiseFloorOffset), (FIXP_DBL)MAXVAL_DBL>>NOISE_FLOOR_OFFSET_SCALING) << NOISE_FLOOR_OFFSET_SCALING; +  }    /*     * check to see that we don't exceed the maximum allowed level diff --git a/libSBRenc/src/sbr_encoder.cpp b/libSBRenc/src/sbr_encoder.cpp index 221aecd..9bb98c8 100644 --- a/libSBRenc/src/sbr_encoder.cpp +++ b/libSBRenc/src/sbr_encoder.cpp @@ -103,7 +103,7 @@ amm-info@iis.fraunhofer.de  #define SBRENCODER_LIB_VL0 3  #define SBRENCODER_LIB_VL1 3 -#define SBRENCODER_LIB_VL2 6 +#define SBRENCODER_LIB_VL2 8 @@ -1552,12 +1552,6 @@ INT FDKsbrEnc_EnvInit (    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; @@ -1847,7 +1841,7 @@ INT sbrEncoder_Init( -    if ( (aot==AOT_PS) || (aot==AOT_MP2_PS) || (aot==AOT_DABPLUS_PS) || (aot==AOT_DRM_MPEG_PS) ) { +    if ( (aot==AOT_PS) ) {          usePs = 1;      }      if ( (aot==AOT_ER_AAC_ELD) ) { diff --git a/libSBRenc/src/tran_det.cpp b/libSBRenc/src/tran_det.cpp index 1e0a59f..6c62b4c 100644 --- a/libSBRenc/src/tran_det.cpp +++ b/libSBRenc/src/tran_det.cpp @@ -2,7 +2,7 @@  /* -----------------------------------------------------------------------------------------------------------  Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright  1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. +© Copyright  1995 - 2015 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.    All rights reserved.   1.    INTRODUCTION @@ -676,7 +676,7 @@ FDKsbrEnc_InitSbrTransientDetector(HANDLE_SBR_TRANSIENT_DETECTOR h_sbrTransientD      tmp = fixMax(tmp, FL2FXCONST_DBL(0.0001));      tmp = fDivNorm(FL2FXCONST_DBL(0.000075), fPow2(tmp), &scale_1); -    scale_1 = -(scale_1 + scale_0 + 2); +    scale_1 = (scale_1 + scale_0 + 2);      FDK_ASSERT(no_cols <= QMF_MAX_TIME_SLOTS);      FDK_ASSERT(no_rows <= QMF_CHANNELS); @@ -684,14 +684,7 @@ FDKsbrEnc_InitSbrTransientDetector(HANDLE_SBR_TRANSIENT_DETECTOR h_sbrTransientD      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->split_thr = scaleValueSaturate(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); diff --git a/libSYS/include/FDK_audio.h b/libSYS/include/FDK_audio.h index 0660f4c..98ded3b 100644 --- a/libSYS/include/FDK_audio.h +++ b/libSYS/include/FDK_audio.h @@ -2,7 +2,7 @@  /* -----------------------------------------------------------------------------------------------------------  Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright  1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. +© Copyright  1995 - 2015 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.    All rights reserved.   1.    INTRODUCTION @@ -134,13 +134,7 @@ typedef enum    TT_MP4_LOAS          = 10, /**< Audio Sync Stream.         */ -  TT_DRM               = 12, /**< Digital Radio Mondial (DRM30/DRM+) bitstream format. */ - -  TT_MP1_L1            = 16, /**< MPEG 1 Audio Layer 1 audio bitstream. */ -  TT_MP1_L2            = 17, /**< MPEG 1 Audio Layer 2 audio bitstream. */ -  TT_MP1_L3            = 18, /**< MPEG 1 Audio Layer 3 audio bitstream. */ - -  TT_RSVD50            = 50 /**< */ +  TT_DRM               = 12  /**< Digital Radio Mondial (DRM30/DRM+) bitstream format. */  } TRANSPORT_TYPE; @@ -203,38 +197,22 @@ typedef enum    AOT_SAOC             = 43, /**< SAOC                                      */    AOT_LD_MPEGS         = 44, /**< Low Delay MPEG Surround                   */ -  AOT_RSVD50           = 50,  /**< Interim AOT for Rsvd50                   */ -    /* Pseudo AOTs */ -  AOT_MP2_AAC_MAIN     = 128, /**< Virtual AOT MP2 Main profile                           */ -  AOT_MP2_AAC_LC       = 129, /**< Virtual AOT MP2 Low Complexity profile                 */ -  AOT_MP2_AAC_SSR      = 130, /**< Virtual AOT MP2 Scalable Sampling Rate profile         */ - -  AOT_MP2_SBR          = 132, /**< Virtual AOT MP2 Low Complexity Profile with SBR        */ - -  AOT_DAB              = 134, /**< Virtual AOT for DAB (Layer2 with scalefactor CRC)      */ -  AOT_DABPLUS_AAC_LC   = 135, /**< Virtual AOT for DAB plus AAC-LC                        */ -  AOT_DABPLUS_SBR      = 136, /**< Virtual AOT for DAB plus HE-AAC                        */ -  AOT_DABPLUS_PS       = 137, /**< Virtual AOT for DAB plus HE-AAC v2                     */ - -  AOT_PLAIN_MP1        = 140, /**< Virtual AOT for plain mp1                              */ -  AOT_PLAIN_MP2        = 141, /**< Virtual AOT for plain mp2                              */ -  AOT_PLAIN_MP3        = 142, /**< Virtual AOT for plain mp3                              */ -    AOT_DRM_AAC          = 143, /**< Virtual AOT for DRM (ER-AAC-SCAL without SBR)          */    AOT_DRM_SBR          = 144, /**< Virtual AOT for DRM (ER-AAC-SCAL with SBR)             */ -  AOT_DRM_MPEG_PS      = 145, /**< Virtual AOT for DRM (ER-AAC-SCAL with SBR and MPEG-PS) */ -  AOT_DRM_SURROUND     = 146, /**< Virtual AOT for DRM Surround (ER-AAC-SCAL (+SBR) +MPS) */ - -  AOT_MP2_PS           = 156, /**< Virtual AOT MP2 Low Complexity Profile with SBR and PS */ - -  AOT_MPEGS_RESIDUALS  = 256  /**< Virtual AOT for MPEG Surround residuals                */ +  AOT_DRM_MPEG_PS      = 145  /**< Virtual AOT for DRM (ER-AAC-SCAL with SBR and MPEG-PS) */  } AUDIO_OBJECT_TYPE; +#define CAN_DO_PS(aot) \ +  ((aot) == AOT_AAC_LC \ +|| (aot) == AOT_SBR \ +|| (aot) == AOT_PS \ +|| (aot) == AOT_ER_BSAC \ +|| (aot) == AOT_DRM_AAC) +  #define IS_USAC(aot) \ -  ((aot) == AOT_USAC \ -|| (aot) == AOT_RSVD50) +  ((aot) == AOT_USAC)  #define IS_LOWDELAY(aot) \    ((aot) == AOT_ER_AAC_LD \ diff --git a/libSYS/src/genericStds.cpp b/libSYS/src/genericStds.cpp index 47d62fc..53abe06 100644 --- a/libSYS/src/genericStds.cpp +++ b/libSYS/src/genericStds.cpp @@ -2,7 +2,7 @@  /* -----------------------------------------------------------------------------------------------------------  Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright  1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. +© Copyright  1995 - 2015 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.    All rights reserved.   1.    INTRODUCTION @@ -99,7 +99,7 @@ amm-info@iis.fraunhofer.de  /* library info */  #define SYS_LIB_VL0 1  #define SYS_LIB_VL1 3 -#define SYS_LIB_VL2 6 +#define SYS_LIB_VL2 7  #define SYS_LIB_TITLE "System Integration Library"  #ifdef __ANDROID__  #define SYS_LIB_BUILD_DATE "" | 
