diff options
author | Andreas Huber <andih@google.com> | 2012-05-21 10:02:14 -0700 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2012-05-21 10:06:42 -0700 |
commit | e35ac2860e99d809a2ccca59bd4eb2f8c02d15ad (patch) | |
tree | de93d3a9fafe23a6d7f9e97ffa0e0a1148c74cf3 /media/libstagefright/codecs/aacdec | |
parent | 8370c7ad4136ad7e0787d5a91ccfa3d63cfbe5cc (diff) | |
download | frameworks_av-e35ac2860e99d809a2ccca59bd4eb2f8c02d15ad.zip frameworks_av-e35ac2860e99d809a2ccca59bd4eb2f8c02d15ad.tar.gz frameworks_av-e35ac2860e99d809a2ccca59bd4eb2f8c02d15ad.tar.bz2 |
Add more verbose ADTS error logging to SoftAAC.
and fix the corresponding code in SoftAAC2.
Change-Id: I6c745fb6e8e093708fdfe2861963b0a35fa7b912
related-to-bug: 6519161
Diffstat (limited to 'media/libstagefright/codecs/aacdec')
-rw-r--r-- | media/libstagefright/codecs/aacdec/SoftAAC.cpp | 50 | ||||
-rw-r--r-- | media/libstagefright/codecs/aacdec/SoftAAC2.cpp | 16 |
2 files changed, 46 insertions, 20 deletions
diff --git a/media/libstagefright/codecs/aacdec/SoftAAC.cpp b/media/libstagefright/codecs/aacdec/SoftAAC.cpp index 65aa2ad..7c82484 100644 --- a/media/libstagefright/codecs/aacdec/SoftAAC.cpp +++ b/media/libstagefright/codecs/aacdec/SoftAAC.cpp @@ -24,6 +24,7 @@ #include <media/stagefright/foundation/ADebug.h> #include <media/stagefright/foundation/hexdump.h> +#include <media/stagefright/MediaErrors.h> namespace android { @@ -322,24 +323,49 @@ void SoftAAC::onQueueFilled(OMX_U32 portIndex) { const uint8_t *adtsHeader = inHeader->pBuffer + inHeader->nOffset; - CHECK_GE(inHeader->nFilledLen, 7); + bool signalError = false; + if (inHeader->nFilledLen < 7) { + ALOGE("Audio data too short to contain even the ADTS header. " + "Got %ld bytes.", inHeader->nFilledLen); + hexdump(adtsHeader, inHeader->nFilledLen); + signalError = true; + } else { + bool protectionAbsent = (adtsHeader[1] & 1); + + unsigned aac_frame_length = + ((adtsHeader[3] & 3) << 11) + | (adtsHeader[4] << 3) + | (adtsHeader[5] >> 5); + + if (inHeader->nFilledLen < aac_frame_length) { + ALOGE("Not enough audio data for the complete frame. " + "Got %ld bytes, frame size according to the ADTS " + "header is %u bytes.", + inHeader->nFilledLen, aac_frame_length); + hexdump(adtsHeader, inHeader->nFilledLen); + signalError = true; + } else { + adtsHeaderSize = (protectionAbsent ? 7 : 9); - bool protectionAbsent = (adtsHeader[1] & 1); + mConfig->pInputBuffer = + (UChar *)adtsHeader + adtsHeaderSize; - unsigned aac_frame_length = - ((adtsHeader[3] & 3) << 11) - | (adtsHeader[4] << 3) - | (adtsHeader[5] >> 5); + mConfig->inputBufferCurrentLength = + aac_frame_length - adtsHeaderSize; - CHECK_GE(inHeader->nFilledLen, aac_frame_length); + inHeader->nOffset += adtsHeaderSize; + inHeader->nFilledLen -= adtsHeaderSize; + } + } - adtsHeaderSize = (protectionAbsent ? 7 : 9); + if (signalError) { + mSignalledError = true; - mConfig->pInputBuffer = (UChar *)adtsHeader + adtsHeaderSize; - mConfig->inputBufferCurrentLength = aac_frame_length - adtsHeaderSize; + notify(OMX_EventError, OMX_ErrorStreamCorrupt, + ERROR_MALFORMED, NULL); - inHeader->nOffset += adtsHeaderSize; - inHeader->nFilledLen -= adtsHeaderSize; + return; + } } else { mConfig->pInputBuffer = inHeader->pBuffer + inHeader->nOffset; mConfig->inputBufferCurrentLength = inHeader->nFilledLen; diff --git a/media/libstagefright/codecs/aacdec/SoftAAC2.cpp b/media/libstagefright/codecs/aacdec/SoftAAC2.cpp index 9f6db4c..76c3854 100644 --- a/media/libstagefright/codecs/aacdec/SoftAAC2.cpp +++ b/media/libstagefright/codecs/aacdec/SoftAAC2.cpp @@ -367,17 +367,17 @@ void SoftAAC2::onQueueFilled(OMX_U32 portIndex) { inHeader->nOffset += adtsHeaderSize; inHeader->nFilledLen -= adtsHeaderSize; } + } - if (signalError) { - mSignalledError = true; + if (signalError) { + mSignalledError = true; - notify(OMX_EventError, - OMX_ErrorStreamCorrupt, - ERROR_MALFORMED, - NULL); + notify(OMX_EventError, + OMX_ErrorStreamCorrupt, + ERROR_MALFORMED, + NULL); - return; - } + return; } } else { inBuffer[0] = inHeader->pBuffer + inHeader->nOffset; |