mirror of
https://github.com/mstorsjo/fdk-aac.git
synced 2025-02-19 20:40:36 +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;
|
goto bail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FDKcrcReset(&pAdts->crcInfo);
|
||||||
if (!bs.protection_absent) {
|
if (!bs.protection_absent) {
|
||||||
FDKcrcReset(&pAdts->crcInfo);
|
|
||||||
FDKpushBack(hBs, 56); /* complete fixed and variable header! */
|
FDKpushBack(hBs, 56); /* complete fixed and variable header! */
|
||||||
crcReg = FDKcrcStartReg(&pAdts->crcInfo, hBs, 0);
|
crcReg = FDKcrcStartReg(&pAdts->crcInfo, hBs, 0);
|
||||||
FDKpushFor(hBs, 56);
|
FDKpushFor(hBs, 56);
|
||||||
@ -314,12 +314,46 @@ TRANSPORTDEC_ERROR adtsRead_DecodeHeader(HANDLE_ADTS pAdts,
|
|||||||
if (bs.channel_config == 0) {
|
if (bs.channel_config == 0) {
|
||||||
int pceBits = 0;
|
int pceBits = 0;
|
||||||
UINT alignAnchor = FDKgetValidBits(hBs);
|
UINT alignAnchor = FDKgetValidBits(hBs);
|
||||||
|
CProgramConfig tmpPce;
|
||||||
|
|
||||||
if (FDKreadBits(hBs, 3) == ID_PCE) {
|
if (FDKreadBits(hBs, 3) == ID_PCE) {
|
||||||
/* Got luck! Parse the PCE */
|
/* Got luck! Parse the PCE */
|
||||||
crcReg = adtsRead_CrcStartReg(pAdts, hBs, 0);
|
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);
|
adtsRead_CrcEndReg(pAdts, hBs, crcReg);
|
||||||
pceBits = (INT)alignAnchor - (INT)FDKgetValidBits(hBs);
|
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 {
|
} else {
|
||||||
/* Reset CRC because the next bits are the beginning of a
|
/* Reset CRC because the next bits are the beginning of a
|
||||||
|
Loading…
x
Reference in New Issue
Block a user