aboutsummaryrefslogtreecommitdiffstats
path: root/fdk-aac/libMpegTPDec/src/tpdec_adts.cpp
diff options
context:
space:
mode:
authorMatthias P. Braendli <matthias.braendli@mpb.li>2021-06-01 14:42:00 +0200
committerMatthias P. Braendli <matthias.braendli@mpb.li>2021-06-01 14:42:00 +0200
commite0835d4cbde8e3b61b0c965afcd41f8f4b7ac121 (patch)
treef49619fc806249da71afaf2ac14f99e088d24153 /fdk-aac/libMpegTPDec/src/tpdec_adts.cpp
parent5ad4acef6721a67b8156cd6f7b45ad59849ca09b (diff)
downloadODR-AudioEnc-e0835d4cbde8e3b61b0c965afcd41f8f4b7ac121.tar.gz
ODR-AudioEnc-e0835d4cbde8e3b61b0c965afcd41f8f4b7ac121.tar.bz2
ODR-AudioEnc-e0835d4cbde8e3b61b0c965afcd41f8f4b7ac121.zip
Update fdk to v2.0.2
Diffstat (limited to 'fdk-aac/libMpegTPDec/src/tpdec_adts.cpp')
-rw-r--r--fdk-aac/libMpegTPDec/src/tpdec_adts.cpp48
1 files changed, 44 insertions, 4 deletions
diff --git a/fdk-aac/libMpegTPDec/src/tpdec_adts.cpp b/fdk-aac/libMpegTPDec/src/tpdec_adts.cpp
index 1a4e3fd..f936634 100644
--- a/fdk-aac/libMpegTPDec/src/tpdec_adts.cpp
+++ b/fdk-aac/libMpegTPDec/src/tpdec_adts.cpp
@@ -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
@@ -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,15 +314,55 @@ 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 = alignAnchor - FDKgetValidBits(hBs);
+ pceBits = (INT)alignAnchor - (INT)FDKgetValidBits(hBs);
+ adtsHeaderLength += pceBits;
+
+ if (pceBits > (INT)alignAnchor) {
+ goto bail;
+ }
+
/* store the number of PCE bits */
bs.num_pce_bits = pceBits;
} else {