aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean-Michel Trivi <jmtrivi@google.com>2016-04-04 16:06:48 -0700
committerJean-Michel Trivi <jmtrivi@google.com>2016-04-04 17:25:36 -0700
commite1c78ed73faa51f2c7fcb0c4a17a92be9cc747f5 (patch)
treea8dc54ef8dba931c72627e7bbebf1844b81a31f7
parentef30836651bf059c3120c03dd11e08b6aafdae13 (diff)
downloadfdk-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
-rw-r--r--documentation/aacEncoder.pdfbin518665 -> 381677 bytes
-rw-r--r--libAACdec/src/aacdecoder.cpp17
-rw-r--r--libAACdec/src/aacdecoder_lib.cpp4
-rw-r--r--libAACenc/include/aacenc_lib.h23
-rw-r--r--libAACenc/src/aacenc.cpp83
-rw-r--r--libAACenc/src/aacenc.h34
-rw-r--r--libAACenc/src/aacenc_lib.cpp101
-rw-r--r--libAACenc/src/adj_thr.cpp2
-rw-r--r--libAACenc/src/intensity.cpp3
-rw-r--r--libAACenc/src/psy_configuration.cpp5
-rw-r--r--libAACenc/src/psy_main.cpp2
-rw-r--r--libAACenc/src/qc_main.cpp4
-rw-r--r--libFDK/include/fixpoint_math.h12
-rw-r--r--libFDK/src/FDK_core.cpp2
-rw-r--r--libFDK/src/FDK_tools_rom.cpp32
-rw-r--r--libMpegTPDec/src/tpdec_lib.cpp3
-rw-r--r--libMpegTPDec/src/version2
-rw-r--r--libMpegTPEnc/src/tpenc_latm.cpp27
-rw-r--r--libMpegTPEnc/src/version2
-rw-r--r--libSBRdec/src/sbrdecoder.cpp6
-rw-r--r--libSBRenc/src/nf_est.cpp7
-rw-r--r--libSBRenc/src/sbr_encoder.cpp10
-rw-r--r--libSBRenc/src/tran_det.cpp13
-rw-r--r--libSYS/include/FDK_audio.h44
-rw-r--r--libSYS/src/genericStds.cpp4
25 files changed, 227 insertions, 215 deletions
diff --git a/documentation/aacEncoder.pdf b/documentation/aacEncoder.pdf
index e8420b1..efb1858 100644
--- a/documentation/aacEncoder.pdf
+++ b/documentation/aacEncoder.pdf
Binary files differ
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 ""