summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/codecs
diff options
context:
space:
mode:
authorLajos Molnar <lajos@google.com>2013-05-22 14:36:06 -0700
committerLajos Molnar <lajos@google.com>2013-05-22 14:47:03 -0700
commita02eae5e911f3bdc3f84f39c0ef223261b646128 (patch)
tree191f2fac7dc1ad5dc08f2807940546c555186ee2 /media/libstagefright/codecs
parentc7722457d9896c10fd33816fbea831852af68330 (diff)
downloadframeworks_av-a02eae5e911f3bdc3f84f39c0ef223261b646128.zip
frameworks_av-a02eae5e911f3bdc3f84f39c0ef223261b646128.tar.gz
frameworks_av-a02eae5e911f3bdc3f84f39c0ef223261b646128.tar.bz2
stagefright: SoftVP8: Handle EOS flag on frames with content.
SoftVP8 decoder ignored frame content if EOS flag was set on input frame. Now, decode the frame first, unless it is empty. Change-Id: Id105a9eb86103a61390af3de60cae2507028e2d1 Signed-off-by: Lajos Molnar <lajos@google.com> Bug: 9091495
Diffstat (limited to 'media/libstagefright/codecs')
-rw-r--r--media/libstagefright/codecs/on2/dec/SoftVPX.cpp28
1 files changed, 16 insertions, 12 deletions
diff --git a/media/libstagefright/codecs/on2/dec/SoftVPX.cpp b/media/libstagefright/codecs/on2/dec/SoftVPX.cpp
index a400b4c..866e5b0 100644
--- a/media/libstagefright/codecs/on2/dec/SoftVPX.cpp
+++ b/media/libstagefright/codecs/on2/dec/SoftVPX.cpp
@@ -226,6 +226,7 @@ void SoftVPX::onQueueFilled(OMX_U32 portIndex) {
List<BufferInfo *> &inQueue = getPortQueue(0);
List<BufferInfo *> &outQueue = getPortQueue(1);
+ bool EOSseen = false;
while (!inQueue.empty() && !outQueue.empty()) {
BufferInfo *inInfo = *inQueue.begin();
@@ -235,17 +236,20 @@ void SoftVPX::onQueueFilled(OMX_U32 portIndex) {
OMX_BUFFERHEADERTYPE *outHeader = outInfo->mHeader;
if (inHeader->nFlags & OMX_BUFFERFLAG_EOS) {
- inQueue.erase(inQueue.begin());
- inInfo->mOwnedByUs = false;
- notifyEmptyBufferDone(inHeader);
-
- outHeader->nFilledLen = 0;
- outHeader->nFlags = OMX_BUFFERFLAG_EOS;
-
- outQueue.erase(outQueue.begin());
- outInfo->mOwnedByUs = false;
- notifyFillBufferDone(outHeader);
- return;
+ EOSseen = true;
+ if (inHeader->nFilledLen == 0) {
+ inQueue.erase(inQueue.begin());
+ inInfo->mOwnedByUs = false;
+ notifyEmptyBufferDone(inHeader);
+
+ outHeader->nFilledLen = 0;
+ outHeader->nFlags = OMX_BUFFERFLAG_EOS;
+
+ outQueue.erase(outQueue.begin());
+ outInfo->mOwnedByUs = false;
+ notifyFillBufferDone(outHeader);
+ return;
+ }
}
if (vpx_codec_decode(
@@ -282,7 +286,7 @@ void SoftVPX::onQueueFilled(OMX_U32 portIndex) {
outHeader->nOffset = 0;
outHeader->nFilledLen = (width * height * 3) / 2;
- outHeader->nFlags = 0;
+ outHeader->nFlags = EOSseen ? OMX_BUFFERFLAG_EOS : 0;
outHeader->nTimeStamp = inHeader->nTimeStamp;
const uint8_t *srcLine = (const uint8_t *)img->planes[PLANE_Y];