summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2011-05-24 15:56:42 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2011-05-24 15:56:42 -0700
commit90d99759c4607106adcf1dbcc8546aedb2ff089f (patch)
tree3e1c76f97eca01fa32f35cef9a4f45af0adef3ba /media
parent68cb8cfaaf4d01125397ff3bea30603bdc5001d4 (diff)
parentf2af5a2c607e71ff4cd39da28b077c0a68b206fe (diff)
downloadframeworks_av-90d99759c4607106adcf1dbcc8546aedb2ff089f.zip
frameworks_av-90d99759c4607106adcf1dbcc8546aedb2ff089f.tar.gz
frameworks_av-90d99759c4607106adcf1dbcc8546aedb2ff089f.tar.bz2
Merge "Make sure the software mpeg4 decoder supports multiple input frames per input buffer"
Diffstat (limited to 'media')
-rw-r--r--media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.cpp27
-rw-r--r--media/libstagefright/omx/SoftOMXPlugin.cpp2
2 files changed, 21 insertions, 8 deletions
diff --git a/media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.cpp b/media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.cpp
index 13e1662..cffbfb5 100644
--- a/media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.cpp
+++ b/media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.cpp
@@ -360,10 +360,14 @@ void SoftMPEG4::onQueueFilled(OMX_U32 portIndex) {
mFramesConfigured = true;
}
- uint32_t timestamp = 0xFFFFFFFF;
+ uint32_t useExtTimestamp = (inHeader->nOffset == 0);
+
+ // decoder deals in ms, OMX in us.
+ uint32_t timestamp =
+ useExtTimestamp ? (inHeader->nTimeStamp + 500) / 1000 : 0xFFFFFFFF;
+
int32_t bufferSize = inHeader->nFilledLen;
- uint32_t useExtTimestamp = 0;
if (PVDecodeVideoFrame(
mHandle, &bitstream, &timestamp, &bufferSize,
&useExtTimestamp,
@@ -379,13 +383,20 @@ void SoftMPEG4::onQueueFilled(OMX_U32 portIndex) {
return;
}
- outHeader->nTimeStamp = inHeader->nTimeStamp;
+ // decoder deals in ms, OMX in us.
+ outHeader->nTimeStamp = timestamp * 1000;
- inInfo->mOwnedByUs = false;
- inQueue.erase(inQueue.begin());
- inInfo = NULL;
- notifyEmptyBufferDone(inHeader);
- inHeader = NULL;
+ CHECK_LE(bufferSize, inHeader->nFilledLen);
+ inHeader->nOffset += inHeader->nFilledLen - bufferSize;
+ inHeader->nFilledLen = bufferSize;
+
+ if (inHeader->nFilledLen == 0) {
+ inInfo->mOwnedByUs = false;
+ inQueue.erase(inQueue.begin());
+ inInfo = NULL;
+ notifyEmptyBufferDone(inHeader);
+ inHeader = NULL;
+ }
++mInputBufferCount;
diff --git a/media/libstagefright/omx/SoftOMXPlugin.cpp b/media/libstagefright/omx/SoftOMXPlugin.cpp
index 6bd6624..cfbcb96 100644
--- a/media/libstagefright/omx/SoftOMXPlugin.cpp
+++ b/media/libstagefright/omx/SoftOMXPlugin.cpp
@@ -21,6 +21,7 @@
#include "SoftOMXPlugin.h"
#include "include/SoftOMXComponent.h"
+#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/AString.h>
#include <dlfcn.h>
@@ -128,6 +129,7 @@ OMX_ERRORTYPE SoftOMXPlugin::destroyComponentInstance(
void *libHandle = me->libHandle();
+ CHECK_EQ(me->getStrongCount(), 1);
me->decStrong(this);
me = NULL;