summaryrefslogtreecommitdiffstats
path: root/libMpegTPDec/src/tpdec_asc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libMpegTPDec/src/tpdec_asc.cpp')
-rw-r--r--libMpegTPDec/src/tpdec_asc.cpp59
1 files changed, 59 insertions, 0 deletions
diff --git a/libMpegTPDec/src/tpdec_asc.cpp b/libMpegTPDec/src/tpdec_asc.cpp
index 59ad58b..4d7cc02 100644
--- a/libMpegTPDec/src/tpdec_asc.cpp
+++ b/libMpegTPDec/src/tpdec_asc.cpp
@@ -834,6 +834,62 @@ bail:
#endif /* TP_ELD_ENABLE */
+static
+TRANSPORTDEC_ERROR AudioSpecificConfig_ExtensionParse(CSAudioSpecificConfig *self, HANDLE_FDK_BITSTREAM bs, CSTpCallBacks *cb)
+{
+ TP_ASC_EXTENSION_ID lastAscExt, ascExtId = ASCEXT_UNKOWN;
+ INT bitsAvailable = (INT)FDKgetValidBits(bs);
+
+ while (bitsAvailable >= 11)
+ {
+ lastAscExt = ascExtId;
+ ascExtId = (TP_ASC_EXTENSION_ID)FDKreadBits(bs, 11);
+ bitsAvailable -= 11;
+
+ switch (ascExtId) {
+ case ASCEXT_SBR: /* 0x2b7 */
+ if ( (self->m_extensionAudioObjectType != AOT_SBR) && (bitsAvailable >= 5) ) {
+ self->m_extensionAudioObjectType = getAOT(bs);
+
+ if ( (self->m_extensionAudioObjectType == AOT_SBR)
+ || (self->m_extensionAudioObjectType == AOT_ER_BSAC) )
+ { /* Get SBR extension configuration */
+ self->m_sbrPresentFlag = FDKreadBits(bs, 1);
+ bitsAvailable -= 1;
+
+ if ( self->m_sbrPresentFlag == 1 ) {
+ self->m_extensionSamplingFrequency = getSampleRate(bs, &self->m_extensionSamplingFrequencyIndex, 4);
+
+ if ((INT)self->m_extensionSamplingFrequency <= 0) {
+ return TRANSPORTDEC_PARSE_ERROR;
+ }
+ }
+ if ( self->m_extensionAudioObjectType == AOT_ER_BSAC ) {
+ self->m_extensionChannelConfiguration = FDKreadBits(bs, 4);
+ bitsAvailable -= 4;
+ }
+ }
+ /* Update counter because of variable length fields (AOT and sampling rate) */
+ bitsAvailable = (INT)FDKgetValidBits(bs);
+ }
+ break;
+ case ASCEXT_PS: /* 0x548 */
+ if ( (lastAscExt == ASCEXT_SBR)
+ && (self->m_extensionAudioObjectType == AOT_SBR)
+ && (bitsAvailable > 0) )
+ { /* Get PS extension configuration */
+ self->m_psPresentFlag = FDKreadBits(bs, 1);
+ bitsAvailable -= 1;
+ }
+ break;
+ default:
+ /* Just ignore anything. */
+ return TRANSPORTDEC_OK;
+ }
+ }
+
+ return TRANSPORTDEC_OK;
+}
/*
* API Functions
@@ -984,6 +1040,9 @@ TRANSPORTDEC_ERROR AudioSpecificConfig_Parse(
break;
}
+ if (fExplicitBackwardCompatible) {
+ ErrorStatus = AudioSpecificConfig_ExtensionParse(self, bs, cb);
+ }
return (ErrorStatus);
}