diff options
Diffstat (limited to 'media/libstagefright/codecs/aacdec')
-rw-r--r-- | media/libstagefright/codecs/aacdec/SoftAAC2.cpp | 52 |
1 files changed, 36 insertions, 16 deletions
diff --git a/media/libstagefright/codecs/aacdec/SoftAAC2.cpp b/media/libstagefright/codecs/aacdec/SoftAAC2.cpp index ff95f9f..566b1db 100644 --- a/media/libstagefright/codecs/aacdec/SoftAAC2.cpp +++ b/media/libstagefright/codecs/aacdec/SoftAAC2.cpp @@ -320,22 +320,39 @@ void SoftAAC2::onQueueFilled(OMX_U32 portIndex) { inInfo->mOwnedByUs = false; notifyEmptyBufferDone(inHeader); - // flush out the decoder's delayed data by calling DecodeFrame one more time, with - // the AACDEC_FLUSH flag set - INT_PCM *outBuffer = - reinterpret_cast<INT_PCM *>(outHeader->pBuffer + outHeader->nOffset); - AAC_DECODER_ERROR decoderErr = aacDecoder_DecodeFrame(mAACDecoder, - outBuffer, - outHeader->nAllocLen, - AACDEC_FLUSH); - if (decoderErr != AAC_DEC_OK) { - mSignalledError = true; - notify(OMX_EventError, OMX_ErrorUndefined, decoderErr, NULL); - return; + if (!mIsFirst) { + // flush out the decoder's delayed data by calling DecodeFrame + // one more time, with the AACDEC_FLUSH flag set + INT_PCM *outBuffer = + reinterpret_cast<INT_PCM *>( + outHeader->pBuffer + outHeader->nOffset); + + AAC_DECODER_ERROR decoderErr = + aacDecoder_DecodeFrame(mAACDecoder, + outBuffer, + outHeader->nAllocLen, + AACDEC_FLUSH); + + if (decoderErr != AAC_DEC_OK) { + mSignalledError = true; + + notify(OMX_EventError, OMX_ErrorUndefined, decoderErr, + NULL); + + return; + } + + outHeader->nFilledLen = + mStreamInfo->frameSize + * sizeof(int16_t) + * mStreamInfo->numChannels; + } else { + // Since we never discarded frames from the start, we won't have + // to add any padding at the end either. + + outHeader->nFilledLen = 0; } - outHeader->nFilledLen = - mStreamInfo->frameSize * sizeof(int16_t) * mStreamInfo->numChannels; outHeader->nFlags = OMX_BUFFERFLAG_EOS; outQueue.erase(outQueue.begin()); @@ -404,7 +421,9 @@ void SoftAAC2::onQueueFilled(OMX_U32 portIndex) { } // Fill and decode - INT_PCM *outBuffer = reinterpret_cast<INT_PCM *>(outHeader->pBuffer + outHeader->nOffset); + INT_PCM *outBuffer = reinterpret_cast<INT_PCM *>( + outHeader->pBuffer + outHeader->nOffset); + bytesValid[0] = inBufferLength[0]; int prevSampleRate = mStreamInfo->sampleRate; @@ -493,7 +512,8 @@ void SoftAAC2::onQueueFilled(OMX_U32 portIndex) { // (decode failed) we'll output a silent frame. if (mIsFirst) { mIsFirst = false; - // the first decoded frame should be discarded to account for decoder delay + // the first decoded frame should be discarded to account + // for decoder delay numOutBytes = 0; } |