mirror of
https://github.com/mstorsjo/fdk-aac.git
synced 2025-06-05 22:39:13 +02:00
Merge "Adjust VBR mode depending on given peak bitrate and fix crash recovery usage." am: 5d8224586c
am: 3152997588
Original change: https://android-review.googlesource.com/c/platform/external/aac/+/1542709 MUST ONLY BE SUBMITTED BY AUTOMERGER Change-Id: Id89e1389e52aaf7ed338f7cf431ed5e9d1fba9f8
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
/* -----------------------------------------------------------------------------
|
||||
Software License for The Fraunhofer FDK AAC Codec Library for Android
|
||||
|
||||
© Copyright 1995 - 2019 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
|
||||
@@ -245,6 +245,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.
|
||||
*
|
||||
@@ -397,7 +437,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;
|
||||
@@ -553,7 +592,6 @@ AAC_ENCODER_ERROR FDKaacEnc_Initialize(
|
||||
qcInit.minBits = fixMin(qcInit.minBits, averageBitsPerFrame & ~7);
|
||||
} else {
|
||||
INT bitreservoir = -1; /* default bitreservoir size*/
|
||||
bitresMin = BITRES_MIN;
|
||||
if (isLowDelay(config->audioObjectType)) {
|
||||
INT brPerChannel = config->bitRate / config->nChannels;
|
||||
brPerChannel = fMin(BITRATE_MAX_LD, fMax(BITRATE_MIN_LD, brPerChannel));
|
||||
@@ -567,7 +605,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;
|
||||
@@ -604,7 +641,8 @@ AAC_ENCODER_ERROR FDKaacEnc_Initialize(
|
||||
qcInit.nSubFrames = config->nSubFrames;
|
||||
qcInit.padding.paddingRest = config->sampleRate;
|
||||
|
||||
if (qcInit.maxBits - qcInit.averageBits >= 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.maxBits > qcInit.averageBits) {
|
||||
qcInit.bitResMode = AACENC_BR_MODE_REDUCED; /* reduced bitreservoir */
|
||||
|
@@ -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
|
||||
@@ -333,6 +333,19 @@ INT FDKaacEnc_GetBitReservoirState(const HANDLE_AAC_ENC hAacEncoder);
|
||||
INT FDKaacEnc_GetVBRBitrate(AACENC_BITRATE_MODE bitrateMode,
|
||||
CHANNEL_MODE channelMode);
|
||||
|
||||
/*-----------------------------------------------------------------------------
|
||||
|
||||
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
|
||||
|
@@ -1028,6 +1028,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.
|
||||
*/
|
||||
|
@@ -1,7 +1,7 @@
|
||||
/* -----------------------------------------------------------------------------
|
||||
Software License for The Fraunhofer FDK AAC Codec Library for Android
|
||||
|
||||
© Copyright 1995 - 2019 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
|
||||
@@ -373,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;
|
||||
|
||||
@@ -800,10 +795,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;
|
||||
}
|
||||
@@ -831,33 +831,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);
|
||||
/* 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;
|
||||
}
|
||||
} 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;
|
||||
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 */
|
||||
|
||||
|
Reference in New Issue
Block a user