1
0
mirror of https://github.com/mstorsjo/fdk-aac.git synced 2025-02-16 11:21:22 +01:00

Do not allow channel configuration change within PCE for ADTS. Fixes assert.

Bug: 146938557
Test: atest DecoderTestXheAac ; atest DecoderTestAacDrc

Change-Id: Icba99bd0eeba1f94298bdd08b85f1b0cb3cf241b
This commit is contained in:
Fraunhofer IIS FDK 2019-11-13 16:10:38 +01:00 committed by Jean-Michel Trivi
parent 262c9f28ec
commit f04a8a855c
2 changed files with 41 additions and 2 deletions

View File

@ -213,8 +213,8 @@ TRANSPORTDEC_ERROR adtsRead_DecodeHeader(HANDLE_ADTS pAdts,
goto bail;
}
FDKcrcReset(&pAdts->crcInfo);
if (!bs.protection_absent) {
FDKcrcReset(&pAdts->crcInfo);
FDKpushBack(hBs, 56); /* complete fixed and variable header! */
crcReg = FDKcrcStartReg(&pAdts->crcInfo, hBs, 0);
FDKpushFor(hBs, 56);
@ -314,12 +314,46 @@ TRANSPORTDEC_ERROR adtsRead_DecodeHeader(HANDLE_ADTS pAdts,
if (bs.channel_config == 0) {
int pceBits = 0;
UINT alignAnchor = FDKgetValidBits(hBs);
CProgramConfig tmpPce;
if (FDKreadBits(hBs, 3) == ID_PCE) {
/* Got luck! Parse the PCE */
crcReg = adtsRead_CrcStartReg(pAdts, hBs, 0);
CProgramConfig_Read(&pAsc->m_progrConfigElement, hBs, alignAnchor);
CProgramConfig_Init(&tmpPce);
CProgramConfig_Read(&tmpPce, hBs, alignAnchor);
if (CProgramConfig_IsValid(&tmpPce)) {
if (CProgramConfig_IsValid(&oldPce)) {
/* Compare the new and the old PCE (tags ignored) */
switch (CProgramConfig_Compare(&tmpPce, &oldPce)) {
case 0: /* Nothing to do because PCE matches the old one exactly. */
case 1: /* Channel configuration not changed. Just new metadata. */
FDKmemcpy(&pAsc->m_progrConfigElement, &tmpPce,
sizeof(CProgramConfig));
break;
case 2: /* The number of channels are identical but not the config
*/
case -1: /* The channel configuration is completely different */
default:
FDKmemcpy(&pAsc->m_progrConfigElement, &oldPce,
sizeof(CProgramConfig));
FDKpushBack(hBs, adtsHeaderLength);
return TRANSPORTDEC_PARSE_ERROR;
}
} else {
FDKmemcpy(&pAsc->m_progrConfigElement, &tmpPce,
sizeof(CProgramConfig));
}
} else {
if (CProgramConfig_IsValid(&oldPce)) {
FDKmemcpy(&pAsc->m_progrConfigElement, &oldPce,
sizeof(CProgramConfig));
} else {
FDKpushBack(hBs, adtsHeaderLength);
return TRANSPORTDEC_PARSE_ERROR;
}
}
adtsRead_CrcEndReg(pAdts, hBs, crcReg);
pceBits = (INT)alignAnchor - (INT)FDKgetValidBits(hBs);

View File

@ -929,6 +929,11 @@ static TRANSPORTDEC_ERROR transportDec_readHeader(
}
}
}
/* if an error is detected terminate config parsing to avoid that an
* invalid config is accepted in the second pass */
if (err != TRANSPORTDEC_OK) {
break;
}
}
} else {
/* Reset CRC because the next bits are the beginning of a