summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean-Michel Trivi <jmtrivi@google.com>2013-08-27 16:17:45 -0700
committerJean-Michel Trivi <jmtrivi@google.com>2013-08-27 16:17:45 -0700
commit2ddc922da87bb675b8ab8c305566436e806df0d9 (patch)
tree37bc76089aabffd8f8d71f2fe2c87b2ae1a2dc13
parent3a0a695565d1d360f9a82173469c8ef858bc08a0 (diff)
downloadfdk-aac-2ddc922da87bb675b8ab8c305566436e806df0d9.tar.gz
fdk-aac-2ddc922da87bb675b8ab8c305566436e806df0d9.tar.bz2
fdk-aac-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.h3
-rw-r--r--libAACdec/src/aacdecoder.cpp6
-rw-r--r--libAACdec/src/aacdecoder_lib.cpp6
-rw-r--r--libMpegTPDec/include/tpdec_lib.h2
-rw-r--r--libMpegTPDec/src/tpdec_asc.cpp10
-rw-r--r--libMpegTPDec/src/version2
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__