diff options
author | Andreas Huber <andih@google.com> | 2012-08-07 14:24:00 -0700 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2012-08-07 14:24:00 -0700 |
commit | 51d7547944967d1157b7fe18e1fb8f7ee6810412 (patch) | |
tree | 5c5d6cb884a163c7ea1f23899776f856fefbd1fa /media/libstagefright/codecs/aacdec | |
parent | e671207115fac3914134c61b336d5fa0242c68ca (diff) | |
download | frameworks_av-51d7547944967d1157b7fe18e1fb8f7ee6810412.zip frameworks_av-51d7547944967d1157b7fe18e1fb8f7ee6810412.tar.gz frameworks_av-51d7547944967d1157b7fe18e1fb8f7ee6810412.tar.bz2 |
Only emit padding at the end of the stream in the aac and mp3 decoders
if we actually discarded content at the beginning of the stream.
Change-Id: I1e79835bb3a02350060a137b94f85f2c90f4a12b
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; } |