diff options
author | Jean-Michel Trivi <jmtrivi@google.com> | 2013-08-27 16:17:45 -0700 |
---|---|---|
committer | Jean-Michel Trivi <jmtrivi@google.com> | 2013-08-27 16:17:45 -0700 |
commit | 2ddc922da87bb675b8ab8c305566436e806df0d9 (patch) | |
tree | 37bc76089aabffd8f8d71f2fe2c87b2ae1a2dc13 | |
parent | 3a0a695565d1d360f9a82173469c8ef858bc08a0 (diff) | |
download | fdk-aac-dabplus-2ddc922da87bb675b8ab8c305566436e806df0d9.tar.gz fdk-aac-dabplus-2ddc922da87bb675b8ab8c305566436e806df0d9.tar.bz2 fdk-aac-dabplus-2ddc922da87bb675b8ab8c305566436e806df0d9.zip |
Decode parametric stereo even with invalid channel config
AAC decoder: Allow decoding of Parametric Stereo (AOT 29) bitstreams
with invalid channel config 2.
Bug 9428126
Change-Id: I1e8b801dfc0e6b1706421342d4985512e83f0dbe
-rw-r--r-- | libAACdec/include/aacdecoder_lib.h | 3 | ||||
-rw-r--r-- | libAACdec/src/aacdecoder.cpp | 6 | ||||
-rw-r--r-- | libAACdec/src/aacdecoder_lib.cpp | 6 | ||||
-rw-r--r-- | libMpegTPDec/include/tpdec_lib.h | 2 | ||||
-rw-r--r-- | libMpegTPDec/src/tpdec_asc.cpp | 10 | ||||
-rw-r--r-- | libMpegTPDec/src/version | 2 |
6 files changed, 18 insertions, 11 deletions
diff --git a/libAACdec/include/aacdecoder_lib.h b/libAACdec/include/aacdecoder_lib.h index d275644..60efe8d 100644 --- a/libAACdec/include/aacdecoder_lib.h +++ b/libAACdec/include/aacdecoder_lib.h @@ -504,7 +504,8 @@ typedef struct INT aacSamplesPerFrame; /*!< Samples per frame for the AAC core (from ASC). \n 1024 or 960 for AAC-LC \n 512 or 480 for AAC-LD and AAC-ELD */ - + INT aacNumChannels; /*!< The number of audio channels after AAC core processing (before PS or MPS processing). + CAUTION: This are not the final number of output channels! */ AUDIO_OBJECT_TYPE extAot; /*!< Extension Audio Object Type (from ASC) */ INT extSamplingRate; /*!< Extension sampling rate in Hz (from ASC) */ diff --git a/libAACdec/src/aacdecoder.cpp b/libAACdec/src/aacdecoder.cpp index 20c7f60..3d00d34 100644 --- a/libAACdec/src/aacdecoder.cpp +++ b/libAACdec/src/aacdecoder.cpp @@ -183,7 +183,7 @@ void CAacDecoder_SyncQmfMode(HANDLE_AACDECODER self) if ( self->qmfModeCurr == NOT_DEFINED ) { if ( (IS_LOWDELAY(self->streamInfo.aot) && (self->flags & AC_MPS_PRESENT)) - || ( (self->ascChannels == 1) + || ( (self->streamInfo.aacNumChannels == 1) && ( (CAN_DO_PS(self->streamInfo.aot) && !(self->flags & AC_MPS_PRESENT)) || ( IS_USAC(self->streamInfo.aot) && (self->flags & AC_MPS_PRESENT)) ) ) ) { @@ -196,7 +196,7 @@ void CAacDecoder_SyncQmfMode(HANDLE_AACDECODER self) /* Set SBR to current QMF mode. Error does not matter. */ sbrDecoder_SetParam(self->hSbrDecoder, SBR_QMF_MODE, (self->qmfModeCurr == MODE_LP)); - self->psPossible = ((CAN_DO_PS(self->streamInfo.aot) && self->aacChannels == 1 && ! (self->flags & AC_MPS_PRESENT))) && self->qmfModeCurr == MODE_HQ ; + self->psPossible = ((CAN_DO_PS(self->streamInfo.aot) && self->streamInfo.aacNumChannels == 1 && ! (self->flags & AC_MPS_PRESENT))) && self->qmfModeCurr == MODE_HQ ; FDK_ASSERT( ! ( (self->flags & AC_MPS_PRESENT) && self->psPossible ) ); } @@ -1573,7 +1573,7 @@ LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame( } /* Update number of output channels */ - self->streamInfo.numChannels = aacChannels; + self->streamInfo.aacNumChannels = aacChannels; #ifdef TP_PCE_ENABLE if (pceRead == 1 && CProgramConfig_IsValid(pce)) { diff --git a/libAACdec/src/aacdecoder_lib.cpp b/libAACdec/src/aacdecoder_lib.cpp index 1dedf68..5f0be30 100644 --- a/libAACdec/src/aacdecoder_lib.cpp +++ b/libAACdec/src/aacdecoder_lib.cpp @@ -110,7 +110,7 @@ amm-info@iis.fraunhofer.de /* Decoder library info */ #define AACDECODER_LIB_VL0 2 #define AACDECODER_LIB_VL1 5 -#define AACDECODER_LIB_VL2 1 +#define AACDECODER_LIB_VL2 2 #define AACDECODER_LIB_TITLE "AAC Decoder Lib" #define AACDECODER_LIB_BUILD_DATE __DATE__ #define AACDECODER_LIB_BUILD_TIME __TIME__ @@ -794,8 +794,8 @@ LINKSPEC_CPP AAC_DECODER_ERROR aacDecoder_DecodeFrame( /* Export data into streaminfo structure */ self->streamInfo.sampleRate = self->streamInfo.aacSampleRate; self->streamInfo.frameSize = self->streamInfo.aacSamplesPerFrame; - self->streamInfo.numChannels = self->aacChannels; } + self->streamInfo.numChannels = self->streamInfo.aacNumChannels; @@ -832,7 +832,7 @@ LINKSPEC_CPP AAC_DECODER_ERROR aacDecoder_DecodeFrame( pTimeData, &self->streamInfo.numChannels, &self->streamInfo.sampleRate, - self->channelOutputMapping[self->aacChannels-1], + self->channelOutputMapping[self->streamInfo.numChannels-1], interleaved, self->frameOK, &self->psPossible); diff --git a/libMpegTPDec/include/tpdec_lib.h b/libMpegTPDec/include/tpdec_lib.h index 7a5aa1c..5cec91d 100644 --- a/libMpegTPDec/include/tpdec_lib.h +++ b/libMpegTPDec/include/tpdec_lib.h @@ -206,7 +206,7 @@ void CProgramConfig_Read ( CProgramConfig *pPce, */ int CProgramConfig_LookupElement( CProgramConfig *pPce, - const UINT channelConfig, + UINT channelConfig, const UINT tag, const UINT channelIdx, UCHAR chMapping[], diff --git a/libMpegTPDec/src/tpdec_asc.cpp b/libMpegTPDec/src/tpdec_asc.cpp index 679808d..e6278d6 100644 --- a/libMpegTPDec/src/tpdec_asc.cpp +++ b/libMpegTPDec/src/tpdec_asc.cpp @@ -267,7 +267,7 @@ void getImplicitAudioChannelTypeAndIndex( int CProgramConfig_LookupElement( CProgramConfig *pPce, - const UINT channelConfig, + UINT channelConfig, const UINT tag, const UINT channelIdx, UCHAR chMapping[], @@ -289,7 +289,13 @@ int CProgramConfig_LookupElement( *elMapping = pPce->elCounter; if (elList[pPce->elCounter] != elType) { /* Not in the list */ - return 0; + if ( (channelConfig == 2) && (elType == ID_SCE) ) + { /* This scenario occurs with HE-AAC v2 streams of buggy encoders. + Due to other decoder implementations decoding of these kind of streams is desired. */ + channelConfig = 1; + } else { + return 0; + } } /* Assume all front channels */ getImplicitAudioChannelTypeAndIndex(&chType[channelIdx], &chIndex[channelIdx], channelConfig, channelIdx); diff --git a/libMpegTPDec/src/version b/libMpegTPDec/src/version index e7bd1b1..d998903 100644 --- a/libMpegTPDec/src/version +++ b/libMpegTPDec/src/version @@ -2,7 +2,7 @@ /* library info */ #define TP_LIB_VL0 2 #define TP_LIB_VL1 3 -#define TP_LIB_VL2 0 +#define TP_LIB_VL2 1 #define TP_LIB_TITLE "MPEG Transport" #define TP_LIB_BUILD_DATE __DATE__ #define TP_LIB_BUILD_TIME __TIME__ |