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:
parent
262c9f28ec
commit
f04a8a855c
@ -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);
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user