summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarco Nelissen <marcone@google.com>2012-04-26 14:18:25 -0700
committerMarco Nelissen <marcone@google.com>2012-04-26 14:54:22 -0700
commit41914becfd019c619783d875c61ef71db0e67400 (patch)
tree00b42f8006f15f864811199dd6feb31725cf6d65
parent0756aa99dffd5740d963fdda60699fdefe58ce85 (diff)
downloadframeworks_av-41914becfd019c619783d875c61ef71db0e67400.zip
frameworks_av-41914becfd019c619783d875c61ef71db0e67400.tar.gz
frameworks_av-41914becfd019c619783d875c61ef71db0e67400.tar.bz2
Account for new AAC decoder's delay
This drops the first block of decoded samples, and flushes the decoder at the end of the stream to get the last bit of valid data. b/774846 Change-Id: I1ae61b3e0619444441d160f33903eb61f57c6d31
-rw-r--r--media/libstagefright/codecs/aacdec/SoftAAC2.cpp19
-rw-r--r--media/libstagefright/codecs/aacdec/SoftAAC2.h1
2 files changed, 19 insertions, 1 deletions
diff --git a/media/libstagefright/codecs/aacdec/SoftAAC2.cpp b/media/libstagefright/codecs/aacdec/SoftAAC2.cpp
index 7706bf6..547a554 100644
--- a/media/libstagefright/codecs/aacdec/SoftAAC2.cpp
+++ b/media/libstagefright/codecs/aacdec/SoftAAC2.cpp
@@ -108,6 +108,7 @@ status_t SoftAAC2::initDecoder() {
status = OK;
}
}
+ mIsFirst = true;
return status;
}
@@ -298,7 +299,16 @@ void SoftAAC2::onQueueFilled(OMX_U32 portIndex) {
inInfo->mOwnedByUs = false;
notifyEmptyBufferDone(inHeader);
- outHeader->nFilledLen = 0;
+ // 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);
+ decoderErr = aacDecoder_DecodeFrame(mAACDecoder,
+ outBuffer,
+ outHeader->nAllocLen,
+ AACDEC_FLUSH);
+ outHeader->nFilledLen =
+ mStreamInfo->frameSize * sizeof(int16_t) * mStreamInfo->numChannels;
outHeader->nFlags = OMX_BUFFERFLAG_EOS;
outQueue.erase(outQueue.begin());
@@ -412,6 +422,12 @@ void SoftAAC2::onQueueFilled(OMX_U32 portIndex) {
// 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 (mIsFirst) {
+ mIsFirst = false;
+ // the first decoded frame should be discarded to account for decoder delay
+ numOutBytes = 0;
+ }
+
outHeader->nFilledLen = numOutBytes;
outHeader->nFlags = 0;
@@ -447,6 +463,7 @@ void SoftAAC2::onPortFlushCompleted(OMX_U32 portIndex) {
// Make sure that the next buffer output does not still
// depend on fragments from the last one decoded.
mInputDiscontinuity = true;
+ mIsFirst = true;
}
}
diff --git a/media/libstagefright/codecs/aacdec/SoftAAC2.h b/media/libstagefright/codecs/aacdec/SoftAAC2.h
index d93685c..e5a1e3e 100644
--- a/media/libstagefright/codecs/aacdec/SoftAAC2.h
+++ b/media/libstagefright/codecs/aacdec/SoftAAC2.h
@@ -50,6 +50,7 @@ private:
HANDLE_AACDECODER mAACDecoder;
CStreamInfo *mStreamInfo;
bool mIsADTS;
+ bool mIsFirst;
size_t mInputBufferCount;
bool mSignalledError;
bool mInputDiscontinuity;