From eca1762d92c43f2b7836941d14e453d4c0f9ed99 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Tue, 23 Aug 2011 10:21:34 -0700 Subject: We were accidentally sending out an output buffer before the final port settings change Change-Id: I4de0d3c377bb12e59524ed370ab3ed0b9a9b70a6 related-to-bug: 5122512 --- media/libstagefright/codecs/aacdec/SoftAAC.cpp | 44 +++++++++++++++----------- 1 file changed, 25 insertions(+), 19 deletions(-) (limited to 'media') diff --git a/media/libstagefright/codecs/aacdec/SoftAAC.cpp b/media/libstagefright/codecs/aacdec/SoftAAC.cpp index f0a330f..2abdb56 100644 --- a/media/libstagefright/codecs/aacdec/SoftAAC.cpp +++ b/media/libstagefright/codecs/aacdec/SoftAAC.cpp @@ -378,23 +378,35 @@ void SoftAAC::onQueueFilled(OMX_U32 portIndex) { // fall through } - if (mUpsamplingFactor == 2) { - if (mConfig->desiredChannels == 1) { - memcpy(&mConfig->pOutputBuffer[1024], - &mConfig->pOutputBuffer[2048], - numOutBytes * 2); + if (decoderErr == MP4AUDEC_SUCCESS || mNumSamplesOutput > 0) { + // We'll only output data if we successfully decoded it or + // we've previously decoded valid data, in the latter case + // (decode failed) we'll output a silent frame. + + if (mUpsamplingFactor == 2) { + if (mConfig->desiredChannels == 1) { + memcpy(&mConfig->pOutputBuffer[1024], + &mConfig->pOutputBuffer[2048], + numOutBytes * 2); + } + numOutBytes *= 2; } - numOutBytes *= 2; - } - outHeader->nFilledLen = numOutBytes; - outHeader->nFlags = 0; + outHeader->nFilledLen = numOutBytes; + outHeader->nFlags = 0; - outHeader->nTimeStamp = - mAnchorTimeUs - + (mNumSamplesOutput * 1000000ll) / mConfig->samplingRate; + outHeader->nTimeStamp = + mAnchorTimeUs + + (mNumSamplesOutput * 1000000ll) / mConfig->samplingRate; - mNumSamplesOutput += mConfig->frameLength * mUpsamplingFactor; + mNumSamplesOutput += mConfig->frameLength * mUpsamplingFactor; + + outInfo->mOwnedByUs = false; + outQueue.erase(outQueue.begin()); + outInfo = NULL; + notifyFillBufferDone(outHeader); + outHeader = NULL; + } if (inHeader->nFilledLen == 0) { inInfo->mOwnedByUs = false; @@ -404,12 +416,6 @@ void SoftAAC::onQueueFilled(OMX_U32 portIndex) { inHeader = NULL; } - outInfo->mOwnedByUs = false; - outQueue.erase(outQueue.begin()); - outInfo = NULL; - notifyFillBufferDone(outHeader); - outHeader = NULL; - if (decoderErr == MP4AUDEC_SUCCESS) { ++mInputBufferCount; } -- cgit v1.1