mirror of https://github.com/mstorsjo/fdk-aac.git
Merge changes I6aaeef87,I9681942b,I60ac86f0,I025e943e,I75edf24b
* changes: Improve decoder robustness by storing flags and elFlags temporarily. ELD downscale factor 3 is only allowed for framesize 480. Check transportDec_OutOfBandConfig() input buffer size parameter. Evaluate and return StoreConfigAsBitstream() error state. Introduce aacDecoder_drcDisable() and always disable legacy DRC for USAC.
This commit is contained in:
commit
e1f4578a40
|
@ -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
|
||||
|
@ -149,6 +149,19 @@ static INT convert_drcParam(FIXP_DBL param_dbl) {
|
|||
return (INT)param_long;
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Disable DRC
|
||||
|
||||
\self Handle of DRC info
|
||||
|
||||
\return none
|
||||
*/
|
||||
void aacDecoder_drcDisable(HANDLE_AAC_DRC self) {
|
||||
self->enable = 0;
|
||||
self->applyExtGain = 0;
|
||||
self->progRefLevelPresent = 0;
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Reset DRC information
|
||||
|
||||
|
|
|
@ -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
|
||||
|
@ -140,6 +140,8 @@ typedef enum {
|
|||
/**
|
||||
* \brief DRC module interface functions
|
||||
*/
|
||||
void aacDecoder_drcDisable(HANDLE_AAC_DRC self);
|
||||
|
||||
void aacDecoder_drcReset(HANDLE_AAC_DRC self);
|
||||
|
||||
void aacDecoder_drcInit(HANDLE_AAC_DRC self);
|
||||
|
|
|
@ -1396,6 +1396,31 @@ static void CAacDecoder_DeInit(HANDLE_AACDECODER self,
|
|||
self->samplingRateInfo[subStreamIndex].samplingRate = 0;
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief CAacDecoder_AcceptFlags Accept flags and element flags
|
||||
*
|
||||
* \param self [o] handle to AACDECODER structure
|
||||
* \param asc [i] handle to ASC structure
|
||||
* \param flags [i] flags
|
||||
* \param elFlags [i] pointer to element flags
|
||||
* \param streamIndex [i] stream index
|
||||
* \param elementOffset [i] element offset
|
||||
*
|
||||
* \return void
|
||||
*/
|
||||
static void CAacDecoder_AcceptFlags(HANDLE_AACDECODER self,
|
||||
const CSAudioSpecificConfig *asc,
|
||||
UINT flags, UINT *elFlags, int streamIndex,
|
||||
int elementOffset) {
|
||||
{
|
||||
FDKmemcpy(
|
||||
self->elFlags, elFlags,
|
||||
sizeof(*elFlags) * (3 * ((8) * 2) + (((8) * 2)) / 2 + 4 * (1) + 1));
|
||||
}
|
||||
|
||||
self->flags[streamIndex] = flags;
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief CAacDecoder_CtrlCFGChange Set config change parameters.
|
||||
*
|
||||
|
@ -1493,6 +1518,9 @@ CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc,
|
|||
const int streamIndex = 0;
|
||||
INT flushChannels = 0;
|
||||
|
||||
UINT flags;
|
||||
UINT elFlags[(3 * ((8) * 2) + (((8) * 2)) / 2 + 4 * (1) + 1)];
|
||||
|
||||
if (!self) return AAC_DEC_INVALID_HANDLE;
|
||||
|
||||
UCHAR downscaleFactor = self->downscaleFactor;
|
||||
|
@ -1649,8 +1677,8 @@ CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc,
|
|||
}
|
||||
|
||||
/* Set syntax flags */
|
||||
self->flags[streamIndex] = 0;
|
||||
{ FDKmemclear(self->elFlags, sizeof(self->elFlags)); }
|
||||
flags = 0;
|
||||
{ FDKmemclear(elFlags, sizeof(elFlags)); }
|
||||
|
||||
if ((asc->m_channelConfiguration > 0) || IS_USAC(asc->m_aot)) {
|
||||
if (IS_USAC(asc->m_aot)) {
|
||||
|
@ -1700,31 +1728,30 @@ CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc,
|
|||
}
|
||||
}
|
||||
|
||||
self->elFlags[el] |=
|
||||
(asc->m_sc.m_usacConfig.element[_el].m_noiseFilling)
|
||||
elFlags[el] |= (asc->m_sc.m_usacConfig.element[_el].m_noiseFilling)
|
||||
? AC_EL_USAC_NOISE
|
||||
: 0;
|
||||
self->elFlags[el] |=
|
||||
elFlags[el] |=
|
||||
(asc->m_sc.m_usacConfig.element[_el].m_stereoConfigIndex > 0)
|
||||
? AC_EL_USAC_MPS212
|
||||
: 0;
|
||||
self->elFlags[el] |= (asc->m_sc.m_usacConfig.element[_el].m_interTes)
|
||||
elFlags[el] |= (asc->m_sc.m_usacConfig.element[_el].m_interTes)
|
||||
? AC_EL_USAC_ITES
|
||||
: 0;
|
||||
self->elFlags[el] |=
|
||||
elFlags[el] |=
|
||||
(asc->m_sc.m_usacConfig.element[_el].m_pvc) ? AC_EL_USAC_PVC : 0;
|
||||
self->elFlags[el] |=
|
||||
elFlags[el] |=
|
||||
(asc->m_sc.m_usacConfig.element[_el].usacElementType == ID_USAC_LFE)
|
||||
? AC_EL_USAC_LFE
|
||||
: 0;
|
||||
self->elFlags[el] |=
|
||||
elFlags[el] |=
|
||||
(asc->m_sc.m_usacConfig.element[_el].usacElementType == ID_USAC_LFE)
|
||||
? AC_EL_LFE
|
||||
: 0;
|
||||
if ((asc->m_sc.m_usacConfig.element[_el].usacElementType ==
|
||||
ID_USAC_CPE) &&
|
||||
((self->usacStereoConfigIndex[el] == 0))) {
|
||||
self->elFlags[el] |= AC_EL_USAC_CP_POSSIBLE;
|
||||
elFlags[el] |= AC_EL_USAC_CP_POSSIBLE;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1791,9 +1818,17 @@ CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc,
|
|||
downscaleFactorInBS =
|
||||
asc->m_samplingFrequency /
|
||||
asc->m_sc.m_eldSpecificConfig.m_downscaledSamplingFrequency;
|
||||
if (downscaleFactorInBS == 1 || downscaleFactorInBS == 2 ||
|
||||
downscaleFactorInBS == 3 || downscaleFactorInBS == 4) {
|
||||
if ((downscaleFactorInBS == 1 || downscaleFactorInBS == 2 ||
|
||||
(downscaleFactorInBS == 3 &&
|
||||
asc->m_sc.m_eldSpecificConfig.m_frameLengthFlag) ||
|
||||
downscaleFactorInBS == 4) &&
|
||||
((asc->m_samplingFrequency %
|
||||
asc->m_sc.m_eldSpecificConfig.m_downscaledSamplingFrequency) ==
|
||||
0)) {
|
||||
downscaleFactor = downscaleFactorInBS;
|
||||
} else {
|
||||
downscaleFactorInBS = 1;
|
||||
downscaleFactor = 1;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
@ -1838,8 +1873,8 @@ CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc,
|
|||
if (configMode & AC_CM_ALLOC_MEM) {
|
||||
self->streamInfo.extSamplingRate = asc->m_extensionSamplingFrequency;
|
||||
}
|
||||
self->flags[streamIndex] |= (asc->m_sbrPresentFlag) ? AC_SBR_PRESENT : 0;
|
||||
self->flags[streamIndex] |= (asc->m_psPresentFlag) ? AC_PS_PRESENT : 0;
|
||||
flags |= (asc->m_sbrPresentFlag) ? AC_SBR_PRESENT : 0;
|
||||
flags |= (asc->m_psPresentFlag) ? AC_PS_PRESENT : 0;
|
||||
if (asc->m_sbrPresentFlag) {
|
||||
self->sbrEnabled = 1;
|
||||
self->sbrEnabledPrev = 1;
|
||||
|
@ -1865,51 +1900,47 @@ CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc,
|
|||
}
|
||||
|
||||
/* --------- vcb11 ------------ */
|
||||
self->flags[streamIndex] |= (asc->m_vcb11Flag) ? AC_ER_VCB11 : 0;
|
||||
flags |= (asc->m_vcb11Flag) ? AC_ER_VCB11 : 0;
|
||||
|
||||
/* ---------- rvlc ------------ */
|
||||
self->flags[streamIndex] |= (asc->m_rvlcFlag) ? AC_ER_RVLC : 0;
|
||||
flags |= (asc->m_rvlcFlag) ? AC_ER_RVLC : 0;
|
||||
|
||||
/* ----------- hcr ------------ */
|
||||
self->flags[streamIndex] |= (asc->m_hcrFlag) ? AC_ER_HCR : 0;
|
||||
flags |= (asc->m_hcrFlag) ? AC_ER_HCR : 0;
|
||||
|
||||
if (asc->m_aot == AOT_ER_AAC_ELD) {
|
||||
self->mpsEnableCurr = 0;
|
||||
self->flags[streamIndex] |= AC_ELD;
|
||||
self->flags[streamIndex] |=
|
||||
(asc->m_sbrPresentFlag)
|
||||
flags |= AC_ELD;
|
||||
flags |= (asc->m_sbrPresentFlag)
|
||||
? AC_SBR_PRESENT
|
||||
: 0; /* Need to set the SBR flag for backward-compatibility
|
||||
reasons. Even if SBR is not supported. */
|
||||
self->flags[streamIndex] |=
|
||||
(asc->m_sc.m_eldSpecificConfig.m_sbrCrcFlag) ? AC_SBRCRC : 0;
|
||||
self->flags[streamIndex] |=
|
||||
(asc->m_sc.m_eldSpecificConfig.m_useLdQmfTimeAlign) ? AC_MPS_PRESENT
|
||||
flags |= (asc->m_sc.m_eldSpecificConfig.m_sbrCrcFlag) ? AC_SBRCRC : 0;
|
||||
flags |= (asc->m_sc.m_eldSpecificConfig.m_useLdQmfTimeAlign)
|
||||
? AC_MPS_PRESENT
|
||||
: 0;
|
||||
if (self->mpsApplicable) {
|
||||
self->mpsEnableCurr = asc->m_sc.m_eldSpecificConfig.m_useLdQmfTimeAlign;
|
||||
}
|
||||
}
|
||||
self->flags[streamIndex] |= (asc->m_aot == AOT_ER_AAC_LD) ? AC_LD : 0;
|
||||
self->flags[streamIndex] |= (asc->m_epConfig >= 0) ? AC_ER : 0;
|
||||
flags |= (asc->m_aot == AOT_ER_AAC_LD) ? AC_LD : 0;
|
||||
flags |= (asc->m_epConfig >= 0) ? AC_ER : 0;
|
||||
|
||||
if (asc->m_aot == AOT_USAC) {
|
||||
self->flags[streamIndex] |= AC_USAC;
|
||||
self->flags[streamIndex] |=
|
||||
(asc->m_sc.m_usacConfig.element[0].m_stereoConfigIndex > 0)
|
||||
flags |= AC_USAC;
|
||||
flags |= (asc->m_sc.m_usacConfig.element[0].m_stereoConfigIndex > 0)
|
||||
? AC_MPS_PRESENT
|
||||
: 0;
|
||||
}
|
||||
if (asc->m_aot == AOT_DRM_AAC) {
|
||||
self->flags[streamIndex] |= AC_DRM | AC_SBRCRC | AC_SCALABLE;
|
||||
flags |= AC_DRM | AC_SBRCRC | AC_SCALABLE;
|
||||
}
|
||||
if (asc->m_aot == AOT_DRM_SURROUND) {
|
||||
self->flags[streamIndex] |=
|
||||
AC_DRM | AC_SBRCRC | AC_SCALABLE | AC_MPS_PRESENT;
|
||||
flags |= AC_DRM | AC_SBRCRC | AC_SCALABLE | AC_MPS_PRESENT;
|
||||
FDK_ASSERT(!asc->m_psPresentFlag);
|
||||
}
|
||||
if ((asc->m_aot == AOT_AAC_SCAL) || (asc->m_aot == AOT_ER_AAC_SCAL)) {
|
||||
self->flags[streamIndex] |= AC_SCALABLE;
|
||||
flags |= AC_SCALABLE;
|
||||
}
|
||||
|
||||
if ((asc->m_epConfig >= 0) && (asc->m_channelConfiguration <= 0)) {
|
||||
|
@ -1960,6 +1991,10 @@ CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc,
|
|||
if (ascChanged != 0) {
|
||||
*configChanged = 1;
|
||||
}
|
||||
|
||||
CAacDecoder_AcceptFlags(self, asc, flags, elFlags, streamIndex,
|
||||
elementOffset);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -1988,7 +2023,7 @@ CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc,
|
|||
}
|
||||
|
||||
if (usacStereoConfigIndex == 3) {
|
||||
self->flags[streamIndex] |= AC_USAC_SCFGI3;
|
||||
flags |= AC_USAC_SCFGI3;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -2069,14 +2104,14 @@ CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc,
|
|||
ch = aacChannelsOffset;
|
||||
int _numElements;
|
||||
_numElements = (((8)) + (8));
|
||||
if (self->flags[streamIndex] & (AC_RSV603DA | AC_USAC)) {
|
||||
if (flags & (AC_RSV603DA | AC_USAC)) {
|
||||
_numElements = (int)asc->m_sc.m_usacConfig.m_usacNumElements;
|
||||
}
|
||||
for (int _el = 0; _el < _numElements; _el++) {
|
||||
int el_channels = 0;
|
||||
int el = elementOffset + _el;
|
||||
|
||||
if (self->flags[streamIndex] &
|
||||
if (flags &
|
||||
(AC_ER | AC_LD | AC_ELD | AC_RSV603DA | AC_USAC | AC_RSVD50)) {
|
||||
if (ch >= ascChannels) {
|
||||
break;
|
||||
|
@ -2176,15 +2211,14 @@ CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc,
|
|||
if (self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer == NULL) {
|
||||
goto bail;
|
||||
}
|
||||
if (self->flags[streamIndex] &
|
||||
(AC_USAC | AC_RSVD50 | AC_RSV603DA /*|AC_BSAC*/)) {
|
||||
if (flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA /*|AC_BSAC*/)) {
|
||||
self->pAacDecoderStaticChannelInfo[ch]->hArCo = CArco_Create();
|
||||
if (self->pAacDecoderStaticChannelInfo[ch]->hArCo == NULL) {
|
||||
goto bail;
|
||||
}
|
||||
}
|
||||
|
||||
if (!(self->flags[streamIndex] & (AC_USAC | AC_RSV603DA))) {
|
||||
if (!(flags & (AC_USAC | AC_RSV603DA))) {
|
||||
CPns_UpdateNoiseState(
|
||||
&self->pAacDecoderChannelInfo[ch]->data.aac.PnsData,
|
||||
&self->pAacDecoderStaticChannelInfo[ch]->pnsCurrentSeed,
|
||||
|
@ -2195,7 +2229,7 @@ CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc,
|
|||
chIdx++;
|
||||
}
|
||||
|
||||
if (self->flags[streamIndex] & AC_USAC) {
|
||||
if (flags & AC_USAC) {
|
||||
for (int _ch = 0; _ch < flushChannels; _ch++) {
|
||||
ch = aacChannelsOffset + _ch;
|
||||
if (self->pTimeDataFlush[ch] == NULL) {
|
||||
|
@ -2207,7 +2241,7 @@ CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc,
|
|||
}
|
||||
}
|
||||
|
||||
if (self->flags[streamIndex] & (AC_USAC | AC_RSV603DA)) {
|
||||
if (flags & (AC_USAC | AC_RSV603DA)) {
|
||||
int complexStereoPredPossible = 0;
|
||||
ch = aacChannelsOffset;
|
||||
chIdx = aacChannelsOffsetIdx;
|
||||
|
@ -2223,7 +2257,7 @@ CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc,
|
|||
elCh = 1;
|
||||
}
|
||||
|
||||
if (self->elFlags[el2] & AC_EL_USAC_CP_POSSIBLE) {
|
||||
if (elFlags[el2] & AC_EL_USAC_CP_POSSIBLE) {
|
||||
complexStereoPredPossible = 1;
|
||||
if (self->cpeStaticData[el2] == NULL) {
|
||||
self->cpeStaticData[el2] = GetCpePersistentData();
|
||||
|
@ -2360,9 +2394,6 @@ CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc,
|
|||
}
|
||||
}
|
||||
|
||||
/* Update externally visible copy of flags */
|
||||
self->streamInfo.flags = self->flags[0];
|
||||
|
||||
if (*configChanged) {
|
||||
int drcDecSampleRate, drcDecFrameSize;
|
||||
|
||||
|
@ -2383,8 +2414,7 @@ CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc,
|
|||
|
||||
if (*configChanged) {
|
||||
if (asc->m_aot == AOT_USAC) {
|
||||
self->hDrcInfo->enable = 0;
|
||||
self->hDrcInfo->progRefLevelPresent = 0;
|
||||
aacDecoder_drcDisable(self->hDrcInfo);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2393,6 +2423,12 @@ CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc,
|
|||
pcmLimiter_SetThreshold(self->hLimiter, FL2FXCONST_DBL(0.89125094f));
|
||||
}
|
||||
|
||||
CAacDecoder_AcceptFlags(self, asc, flags, elFlags, streamIndex,
|
||||
elementOffset);
|
||||
|
||||
/* Update externally visible copy of flags */
|
||||
self->streamInfo.flags = self->flags[0];
|
||||
|
||||
return err;
|
||||
|
||||
bail:
|
||||
|
@ -3194,11 +3230,12 @@ LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame(
|
|||
* data in the bitstream. */
|
||||
self->flags[streamIndex] |= AC_DRC_PRESENT;
|
||||
} else {
|
||||
self->hDrcInfo->enable = 0;
|
||||
self->hDrcInfo->progRefLevelPresent = 0;
|
||||
ErrorStatus = AAC_DEC_UNSUPPORTED_FORMAT;
|
||||
}
|
||||
}
|
||||
if (self->flags[streamIndex] & (AC_USAC | AC_RSV603DA)) {
|
||||
aacDecoder_drcDisable(self->hDrcInfo);
|
||||
}
|
||||
|
||||
/* Create a reverse mapping table */
|
||||
UCHAR Reverse_chMapping[((8) * 2)];
|
||||
|
@ -3441,11 +3478,12 @@ LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame(
|
|||
* data in the bitstream. */
|
||||
self->flags[streamIndex] |= AC_DRC_PRESENT;
|
||||
} else {
|
||||
self->hDrcInfo->enable = 0;
|
||||
self->hDrcInfo->progRefLevelPresent = 0;
|
||||
ErrorStatus = AAC_DEC_UNSUPPORTED_FORMAT;
|
||||
}
|
||||
}
|
||||
if (self->flags[streamIndex] & (AC_USAC | AC_RSV603DA)) {
|
||||
aacDecoder_drcDisable(self->hDrcInfo);
|
||||
}
|
||||
}
|
||||
|
||||
/* Add additional concealment delay */
|
||||
|
|
|
@ -1179,10 +1179,12 @@ LINKSPEC_CPP AAC_DECODER_ERROR aacDecoder_DecodeFrame(HANDLE_AACDECODER self,
|
|||
aacDecoder_FreeMemCallback(self, &asc);
|
||||
self->streamInfo.numChannels = 0;
|
||||
/* 3) restore AudioSpecificConfig */
|
||||
if (asc.configBits <= (TP_USAC_MAX_CONFIG_LEN << 3)) {
|
||||
transportDec_OutOfBandConfig(self->hInput, asc.config,
|
||||
(asc.configBits + 7) >> 3, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!((flags & (AACDEC_CONCEAL | AACDEC_FLUSH)) ||
|
||||
(self->flushStatus == AACDEC_RSV60_DASH_IPF_ATSC_FLUSH_ON) ||
|
||||
|
|
|
@ -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
|
||||
|
@ -1996,9 +1996,11 @@ static TRANSPORTDEC_ERROR UsacConfig_Parse(CSAudioSpecificConfig *asc,
|
|||
|
||||
/* Copy UsacConfig() to asc->m_sc.m_usacConfig.UsacConfig[] buffer. */
|
||||
INT configSize_bits = (INT)FDKgetValidBits(hBs) - nbits;
|
||||
StoreConfigAsBitstream(hBs, configSize_bits,
|
||||
if (StoreConfigAsBitstream(hBs, configSize_bits,
|
||||
asc->m_sc.m_usacConfig.UsacConfig,
|
||||
TP_USAC_MAX_CONFIG_LEN);
|
||||
TP_USAC_MAX_CONFIG_LEN)) {
|
||||
return TRANSPORTDEC_PARSE_ERROR;
|
||||
}
|
||||
asc->m_sc.m_usacConfig.UsacConfigBits = fAbs(configSize_bits);
|
||||
|
||||
return err;
|
||||
|
@ -2300,8 +2302,10 @@ TRANSPORTDEC_ERROR AudioSpecificConfig_Parse(
|
|||
/* Copy config() to asc->config[] buffer. */
|
||||
if ((ErrorStatus == TRANSPORTDEC_OK) && (self->m_aot == AOT_USAC)) {
|
||||
INT configSize_bits = (INT)FDKgetValidBits(bs) - (INT)ascStartAnchor;
|
||||
StoreConfigAsBitstream(bs, configSize_bits, self->config,
|
||||
TP_USAC_MAX_CONFIG_LEN);
|
||||
if (StoreConfigAsBitstream(bs, configSize_bits, self->config,
|
||||
TP_USAC_MAX_CONFIG_LEN)) {
|
||||
return TRANSPORTDEC_PARSE_ERROR;
|
||||
}
|
||||
self->configBits = fAbs(configSize_bits);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue