aboutsummaryrefslogtreecommitdiffstats
path: root/libAACenc/src
diff options
context:
space:
mode:
Diffstat (limited to 'libAACenc/src')
-rw-r--r--libAACenc/src/aacEnc_ram.cpp4
-rw-r--r--libAACenc/src/aacEnc_ram.h4
-rw-r--r--libAACenc/src/aacenc.cpp53
-rw-r--r--libAACenc/src/aacenc.h15
-rw-r--r--libAACenc/src/aacenc_lib.cpp39
-rw-r--r--libAACenc/src/adj_thr.cpp8
-rw-r--r--libAACenc/src/bandwidth.cpp12
-rw-r--r--libAACenc/src/qc_main.cpp64
8 files changed, 131 insertions, 68 deletions
diff --git a/libAACenc/src/aacEnc_ram.cpp b/libAACenc/src/aacEnc_ram.cpp
index 77b1131..25e2aec 100644
--- a/libAACenc/src/aacEnc_ram.cpp
+++ b/libAACenc/src/aacEnc_ram.cpp
@@ -1,7 +1,7 @@
/* -----------------------------------------------------------------------------
Software License for The Fraunhofer FDK AAC Codec Library for Android
-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
+© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
Forschung e.V. All rights reserved.
1. INTRODUCTION
@@ -204,5 +204,5 @@ QC_OUT_CHANNEL *GetRam_aacEnc_QCchannel(int n, UCHAR *dynamic_RAM) {
* (dynamic_RAM + P_BUF_0 + n*sizeof(QC_OUT_CHANNEL)) is sufficiently aligned,
* so the cast is safe */
return reinterpret_cast<QC_OUT_CHANNEL *>(reinterpret_cast<void *>(
- dynamic_RAM + P_BUF_0 + n * sizeof(QC_OUT_CHANNEL)));
+ dynamic_RAM + P_BUF_0 + n * ALIGN_SIZE(sizeof(QC_OUT_CHANNEL))));
}
diff --git a/libAACenc/src/aacEnc_ram.h b/libAACenc/src/aacEnc_ram.h
index 0775aae..f24eef1 100644
--- a/libAACenc/src/aacEnc_ram.h
+++ b/libAACenc/src/aacEnc_ram.h
@@ -1,7 +1,7 @@
/* -----------------------------------------------------------------------------
Software License for The Fraunhofer FDK AAC Codec Library for Android
-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
+© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
Forschung e.V. All rights reserved.
1. INTRODUCTION
@@ -198,7 +198,7 @@ struct AAC_ENC {
+++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
-#define BUF_SIZE_0 (ALIGN_SIZE(sizeof(QC_OUT_CHANNEL) * (8)))
+#define BUF_SIZE_0 (ALIGN_SIZE(sizeof(QC_OUT_CHANNEL)) * (8))
#define BUF_SIZE_1 \
(ALIGN_SIZE(maxSize(maxSize(sizeof(PSY_DYNAMIC), \
(BIT_LOOK_UP_SIZE + MERGE_GAIN_LOOK_UP_SIZE)), \
diff --git a/libAACenc/src/aacenc.cpp b/libAACenc/src/aacenc.cpp
index 372df31..42755ab 100644
--- a/libAACenc/src/aacenc.cpp
+++ b/libAACenc/src/aacenc.cpp
@@ -1,7 +1,7 @@
/* -----------------------------------------------------------------------------
Software License for The Fraunhofer FDK AAC Codec Library for Android
-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
+© Copyright 1995 - 2020 Fraunhofer-Gesellschaft zur Förderung der angewandten
Forschung e.V. All rights reserved.
1. INTRODUCTION
@@ -114,6 +114,8 @@ amm-info@iis.fraunhofer.de
#include "genericStds.h"
+#define BITRES_MIN \
+ 300 /* default threshold for using reduced/disabled bitres mode */
#define BITRES_MAX_LD 4000
#define BITRES_MIN_LD 500
#define BITRATE_MAX_LD 70000 /* Max assumed bitrate for bitres calculation */
@@ -244,6 +246,46 @@ INT FDKaacEnc_GetVBRBitrate(AACENC_BITRATE_MODE bitrateMode,
return bitrate;
}
+/*-----------------------------------------------------------------------------
+
+ functionname: FDKaacEnc_AdjustVBRBitrateMode
+ description: Adjust bitrate mode to given bitrate parameter
+ input params: int vbrQuality (VBR0, VBR1, VBR2)
+ bitrate
+ channelMode
+ returns: vbr bitrate mode
+
+ ------------------------------------------------------------------------------*/
+AACENC_BITRATE_MODE FDKaacEnc_AdjustVBRBitrateMode(
+ AACENC_BITRATE_MODE bitrateMode, INT bitrate, CHANNEL_MODE channelMode) {
+ AACENC_BITRATE_MODE newBitrateMode = bitrateMode;
+
+ if (bitrate != -1) {
+ const INT monoStereoMode =
+ (FDKaacEnc_GetMonoStereoMode(channelMode) == EL_MODE_STEREO) ? 1 : 0;
+ const INT nChannelsEff =
+ FDKaacEnc_GetChannelModeConfiguration(channelMode)->nChannelsEff;
+ newBitrateMode = AACENC_BR_MODE_INVALID;
+
+ for (int idx = (int)(sizeof(configTabVBR) / sizeof(*configTabVBR)) - 1;
+ idx >= 0; idx--) {
+ if (bitrate >=
+ configTabVBR[idx].chanBitrate[monoStereoMode] * nChannelsEff) {
+ if (configTabVBR[idx].chanBitrate[monoStereoMode] * nChannelsEff <
+ FDKaacEnc_GetVBRBitrate(bitrateMode, channelMode)) {
+ newBitrateMode = configTabVBR[idx].bitrateMode;
+ } else {
+ newBitrateMode = bitrateMode;
+ }
+ break;
+ }
+ }
+ }
+
+ return AACENC_BR_MODE_IS_VBR(newBitrateMode) ? newBitrateMode
+ : AACENC_BR_MODE_INVALID;
+}
+
/**
* \brief Convert encoder bitreservoir value for transport library.
*
@@ -396,7 +438,6 @@ AAC_ENCODER_ERROR FDKaacEnc_Initialize(
FIXP_DBL mbfac, bw_ratio;
QC_INIT qcInit;
INT averageBitsPerFrame = 0;
- int bitresMin = 0; /* the bitreservoir is always big for AAC-LC */
const CHANNEL_MODE prevChannelMode = hAacEnc->encoderMode;
if (config == NULL) return AAC_ENC_INVALID_HANDLE;
@@ -582,7 +623,7 @@ AAC_ENCODER_ERROR FDKaacEnc_Initialize(
(config->minBitsPerFrame != -1) ? config->minBitsPerFrame : 0;
qcInit.minBits = fixMin(qcInit.minBits, averageBitsPerFrame & ~7);
} else {
- INT bitreservoir = -1; /* default bitrservoir size*/
+ INT bitreservoir = -1; /* default bitreservoir size*/
if (isLowDelay(config->audioObjectType)) {
INT brPerChannel = config->bitRate / config->nChannels;
brPerChannel = fMin(BITRATE_MAX_LD, fMax(BITRATE_MIN_LD, brPerChannel));
@@ -596,7 +637,6 @@ AAC_ENCODER_ERROR FDKaacEnc_Initialize(
bitreservoir = fMultI(slope, (INT)(BITRES_MAX_LD - BITRES_MIN_LD)) +
BITRES_MIN_LD; /* interpolate */
bitreservoir = bitreservoir & ~7; /* align to bytes */
- bitresMin = BITRES_MIN_LD;
}
int maxBitres;
@@ -633,9 +673,10 @@ AAC_ENCODER_ERROR FDKaacEnc_Initialize(
qcInit.nSubFrames = config->nSubFrames;
qcInit.padding.paddingRest = config->sampleRate;
- if (qcInit.bitRes >= bitresMin * config->nChannels) {
+ if (qcInit.maxBits - qcInit.averageBits >=
+ ((qcInit.isLowDelay) ? BITRES_MIN_LD : BITRES_MIN) * config->nChannels) {
qcInit.bitResMode = AACENC_BR_MODE_FULL; /* full bitreservoir */
- } else if (qcInit.bitRes > 0) {
+ } else if (qcInit.maxBits > qcInit.averageBits) {
qcInit.bitResMode = AACENC_BR_MODE_REDUCED; /* reduced bitreservoir */
} else {
qcInit.bitResMode = AACENC_BR_MODE_DISABLED; /* disabled bitreservoir */
diff --git a/libAACenc/src/aacenc.h b/libAACenc/src/aacenc.h
index 291ea54..2d95abb 100644
--- a/libAACenc/src/aacenc.h
+++ b/libAACenc/src/aacenc.h
@@ -1,7 +1,7 @@
/* -----------------------------------------------------------------------------
Software License for The Fraunhofer FDK AAC Codec Library for Android
-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
+© Copyright 1995 - 2020 Fraunhofer-Gesellschaft zur Förderung der angewandten
Forschung e.V. All rights reserved.
1. INTRODUCTION
@@ -336,6 +336,19 @@ INT FDKaacEnc_GetVBRBitrate(AACENC_BITRATE_MODE bitrateMode,
/*-----------------------------------------------------------------------------
+ functionname: FDKaacEnc_AdjustVBRBitrateMode
+ description: Adjust bitrate mode to given bitrate parameter
+ input params: int vbrQuality (VBR0, VBR1, VBR2)
+ bitrate
+ channelMode
+ returns: vbr bitrate mode
+
+ ------------------------------------------------------------------------------*/
+AACENC_BITRATE_MODE FDKaacEnc_AdjustVBRBitrateMode(
+ AACENC_BITRATE_MODE bitrateMode, INT bitrate, CHANNEL_MODE channelMode);
+
+/*-----------------------------------------------------------------------------
+
functionname: FDKaacEnc_AacInitDefaultConfig
description: gives reasonable default configuration
returns: ---
diff --git a/libAACenc/src/aacenc_lib.cpp b/libAACenc/src/aacenc_lib.cpp
index 4eaa662..fbaf407 100644
--- a/libAACenc/src/aacenc_lib.cpp
+++ b/libAACenc/src/aacenc_lib.cpp
@@ -110,9 +110,9 @@ amm-info@iis.fraunhofer.de
/* Encoder library info */
#define AACENCODER_LIB_VL0 4
#define AACENCODER_LIB_VL1 0
-#define AACENCODER_LIB_VL2 0
+#define AACENCODER_LIB_VL2 1
#define AACENCODER_LIB_TITLE "AAC Encoder"
-#ifdef __ANDROID__
+#ifdef SUPPRESS_BUILD_DATE_INFO
#define AACENCODER_LIB_BUILD_DATE ""
#define AACENCODER_LIB_BUILD_TIME ""
#else
@@ -451,6 +451,24 @@ static SBR_PS_SIGNALING getSbrSignalingMode(
return sbrSignaling;
}
+static inline INT getAssociatedChElement(SBR_ELEMENT_INFO *elInfoSbr,
+ CHANNEL_MAPPING *channelMapping) {
+ ELEMENT_INFO *elInfo = channelMapping->elInfo;
+ INT nElements = channelMapping->nElements;
+ INT associatedChElement = -1;
+ int i;
+
+ for (i = 0; i < nElements; i++) {
+ if (elInfoSbr->elType == elInfo[i].elType &&
+ elInfoSbr->instanceTag == elInfo[i].instanceTag) {
+ associatedChElement = i;
+ break;
+ }
+ }
+
+ return associatedChElement;
+}
+
/****************************************************************************
Allocate Encoder
****************************************************************************/
@@ -1055,6 +1073,13 @@ static AACENC_ERROR FDKaacEnc_AdjustEncSettings(HANDLE_AACENCODER hAacEncoder,
case AACENC_BR_MODE_VBR_3:
case AACENC_BR_MODE_VBR_4:
case AACENC_BR_MODE_VBR_5:
+ /* Adjust bitrate mode in case given peak bitrate is lower than expected
+ * VBR bitrate. */
+ if ((INT)config->userPeakBitrate != -1) {
+ hAacConfig->bitrateMode = FDKaacEnc_AdjustVBRBitrateMode(
+ hAacConfig->bitrateMode, config->userPeakBitrate,
+ hAacConfig->channelMode);
+ }
/* Get bitrate in VBR configuration */
/* In VBR mode; SBR-modul depends on bitrate, core encoder on bitrateMode.
*/
@@ -1982,7 +2007,15 @@ AACENC_ERROR aacEncEncode(const HANDLE_AACENCODER hAacEncoder,
{
hAacEncoder->extPayload[nExtensions].dataSize =
hAacEncoder->pSbrPayload->dataSize[nPayload][i];
- hAacEncoder->extPayload[nExtensions].associatedChElement = i;
+ hAacEncoder->extPayload[nExtensions].associatedChElement =
+ getAssociatedChElement(
+ &hAacEncoder->hEnvEnc->sbrElement[i]->elInfo,
+ &hAacEncoder->hAacEnc->channelMapping);
+ if (hAacEncoder->extPayload[nExtensions].associatedChElement ==
+ -1) {
+ err = AACENC_ENCODE_ERROR;
+ goto bail;
+ }
}
hAacEncoder->extPayload[nExtensions].dataType =
EXT_SBR_DATA; /* Once SBR Encoder supports SBR CRC set
diff --git a/libAACenc/src/adj_thr.cpp b/libAACenc/src/adj_thr.cpp
index 226d003..239abd0 100644
--- a/libAACenc/src/adj_thr.cpp
+++ b/libAACenc/src/adj_thr.cpp
@@ -1302,14 +1302,6 @@ static void FDKaacEnc_reduceThresholdsVBR(
if (sfbThrReducedLdData < FL2FXCONST_DBL(-0.5f))
sfbThrReducedLdData = FL2FXCONST_DBL(-1.f);
- /* minimum of 29 dB Ratio for Thresholds */
- if ((sfbEnLdData + FL2FXCONST_DBL(1.0f)) >
- FL2FXCONST_DBL(9.6336206 / LD_DATA_SCALING)) {
- sfbThrReducedLdData = fixMax(
- sfbThrReducedLdData,
- sfbEnLdData - FL2FXCONST_DBL(9.6336206 / LD_DATA_SCALING));
- }
-
sfbThrReducedLdData = fixMax(MIN_LDTHRESH, sfbThrReducedLdData);
qcOutChan->sfbThresholdLdData[sfbGrp + sfb] = sfbThrReducedLdData;
diff --git a/libAACenc/src/bandwidth.cpp b/libAACenc/src/bandwidth.cpp
index 36cd64d..e814f05 100644
--- a/libAACenc/src/bandwidth.cpp
+++ b/libAACenc/src/bandwidth.cpp
@@ -1,7 +1,7 @@
/* -----------------------------------------------------------------------------
Software License for The Fraunhofer FDK AAC Codec Library for Android
-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
+© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
Forschung e.V. All rights reserved.
1. INTRODUCTION
@@ -151,11 +151,11 @@ typedef struct {
static const BANDWIDTH_TAB_VBR bandWidthTableVBR[] = {
{AACENC_BR_MODE_CBR, 0, 0},
- {AACENC_BR_MODE_VBR_1, 13050, 13050},
- {AACENC_BR_MODE_VBR_2, 13050, 13050},
- {AACENC_BR_MODE_VBR_3, 14260, 14260},
- {AACENC_BR_MODE_VBR_4, 15500, 15500},
- {AACENC_BR_MODE_VBR_5, 48000, 48000},
+ {AACENC_BR_MODE_VBR_1, 13000, 13000},
+ {AACENC_BR_MODE_VBR_2, 13000, 13000},
+ {AACENC_BR_MODE_VBR_3, 15750, 15750},
+ {AACENC_BR_MODE_VBR_4, 16500, 16500},
+ {AACENC_BR_MODE_VBR_5, 19293, 19293},
{AACENC_BR_MODE_SFR, 0, 0},
{AACENC_BR_MODE_FF, 0, 0}
diff --git a/libAACenc/src/qc_main.cpp b/libAACenc/src/qc_main.cpp
index 0bf234c..b4c38af 100644
--- a/libAACenc/src/qc_main.cpp
+++ b/libAACenc/src/qc_main.cpp
@@ -1,7 +1,7 @@
/* -----------------------------------------------------------------------------
Software License for The Fraunhofer FDK AAC Codec Library for Android
-© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
+© Copyright 1995 - 2020 Fraunhofer-Gesellschaft zur Förderung der angewandten
Forschung e.V. All rights reserved.
1. INTRODUCTION
@@ -121,20 +121,15 @@ typedef struct {
static const TAB_VBR_QUAL_FACTOR tableVbrQualFactor[] = {
{QCDATA_BR_MODE_VBR_1,
- FL2FXCONST_DBL(0.160f)}, /* Approx. 32 - 48 (AC-LC), 32 - 56
- (AAC-LD/ELD) kbps/channel */
+ FL2FXCONST_DBL(0.150f)}, /* Approx. 32 kbps mono AAC-LC + SBR + PS */
{QCDATA_BR_MODE_VBR_2,
- FL2FXCONST_DBL(0.148f)}, /* Approx. 40 - 56 (AC-LC), 40 - 64
- (AAC-LD/ELD) kbps/channel */
+ FL2FXCONST_DBL(0.162f)}, /* Approx. 64 kbps stereo AAC-LC + SBR */
{QCDATA_BR_MODE_VBR_3,
- FL2FXCONST_DBL(0.135f)}, /* Approx. 48 - 64 (AC-LC), 48 - 72
- (AAC-LD/ELD) kbps/channel */
+ FL2FXCONST_DBL(0.176f)}, /* Approx. 96 kbps stereo AAC-LC */
{QCDATA_BR_MODE_VBR_4,
- FL2FXCONST_DBL(0.111f)}, /* Approx. 64 - 80 (AC-LC), 64 - 88
- (AAC-LD/ELD) kbps/channel */
+ FL2FXCONST_DBL(0.120f)}, /* Approx. 128 kbps stereo AAC-LC */
{QCDATA_BR_MODE_VBR_5,
- FL2FXCONST_DBL(0.070f)} /* Approx. 96 - 120 (AC-LC), 112 - 144
- (AAC-LD/ELD) kbps/channel */
+ FL2FXCONST_DBL(0.070f)} /* Approx. 192 kbps stereo AAC-LC */
};
static INT isConstantBitrateMode(const QCDATA_BR_MODE bitrateMode) {
@@ -378,13 +373,8 @@ AAC_ENCODER_ERROR FDKaacEnc_QCInit(QC_STATE* hQC, struct QC_INIT* init,
hQC->invQuant = init->invQuant;
hQC->maxIterations = init->maxIterations;
- if (isConstantBitrateMode(hQC->bitrateMode)) {
- /* 0: full bitreservoir, 1: reduced bitreservoir, 2: disabled bitreservoir
- */
- hQC->bitResMode = init->bitResMode;
- } else {
- hQC->bitResMode = AACENC_BR_MODE_FULL; /* full bitreservoir */
- }
+ /* 0: full bitreservoir, 1: reduced bitreservoir, 2: disabled bitreservoir */
+ hQC->bitResMode = init->bitResMode;
hQC->padding.paddingRest = init->padding.paddingRest;
@@ -806,10 +796,15 @@ AAC_ENCODER_ERROR FDKaacEnc_QCMain(QC_STATE* RESTRICT hQC, PSY_OUT** psyOut,
INT avgTotalDynBits = 0; /* maximal allowed dynamic bits for all frames */
INT totalAvailableBits = 0;
INT nSubFrames = 1;
+ const INT isCBRAdjustment = (isConstantBitrateMode(hQC->bitrateMode) ||
+ (hQC->bitResMode != AACENC_BR_MODE_FULL))
+ ? 1
+ : 0;
/*-------------------------------------------- */
/* redistribute total bitreservoir to elements */
- ErrorStatus = FDKaacEnc_BitResRedistribution(hQC, cm, avgTotalBits);
+ ErrorStatus = FDKaacEnc_BitResRedistribution(
+ hQC, cm, (isCBRAdjustment == 0) ? hQC->maxBitsPerFrame : avgTotalBits);
if (ErrorStatus != AAC_ENC_OK) {
return ErrorStatus;
}
@@ -837,33 +832,22 @@ AAC_ENCODER_ERROR FDKaacEnc_QCMain(QC_STATE* RESTRICT hQC, PSY_OUT** psyOut,
/*-------------------------------------------- */
/*-------------------------------------------- */
- if (isConstantBitrateMode(hQC->bitrateMode)) {
- /* calc granted dynamic bits for sub frame and
- distribute it to each element */
- ErrorStatus = FDKaacEnc_prepareBitDistribution(
- hQC, psyOut, qcOut, cm, qcElement, avgTotalBits, &totalAvailableBits,
- &avgTotalDynBits);
-
- if (ErrorStatus != AAC_ENC_OK) {
- return ErrorStatus;
- }
- } else {
- qcOut[0]->grantedDynBits =
- ((hQC->maxBitsPerFrame - (hQC->globHdrBits)) & ~7) -
- (qcOut[0]->globalExtBits + qcOut[0]->staticBits +
- qcOut[0]->elementExtBits);
- qcOut[0]->maxDynBits = qcOut[0]->grantedDynBits;
-
- totalAvailableBits = hQC->maxBitsPerFrame;
- avgTotalDynBits = 0;
+ /* calc granted dynamic bits for sub frame and
+ distribute it to each element */
+ ErrorStatus = FDKaacEnc_prepareBitDistribution(
+ hQC, psyOut, qcOut, cm, qcElement,
+ (isCBRAdjustment == 0) ? hQC->maxBitsPerFrame : avgTotalBits,
+ &totalAvailableBits, &avgTotalDynBits);
+
+ if (ErrorStatus != AAC_ENC_OK) {
+ return ErrorStatus;
}
/* for ( all sub frames ) ... */
for (c = 0; c < nSubFrames; c++) {
/* for CBR and VBR mode */
FDKaacEnc_AdjustThresholds(hQC->hAdjThr, qcElement[c], qcOut[c],
- psyOut[c]->psyOutElement,
- isConstantBitrateMode(hQC->bitrateMode), cm);
+ psyOut[c]->psyOutElement, isCBRAdjustment, cm);
} /* -end- sub frame counter */