From 269a355679fce6a71523faeefc2ff575abbd1a8e Mon Sep 17 00:00:00 2001 From: Lajos Molnar Date: Tue, 4 Jun 2013 19:35:03 -0700 Subject: Track exact timestamps in SoftMPEG4/H263 decoders Change-Id: I7772e3afec020f889dea80fd6372afbc36cd68d6 Signed-off-by: Lajos Molnar Bug: 9285553 (cherry picked from commit e113aa1f078cb3d5f8182058e144fd14ce945fca) --- media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.cpp | 16 ++++++++++++---- media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.h | 3 +++ 2 files changed, 15 insertions(+), 4 deletions(-) (limited to 'media/libstagefright/codecs') diff --git a/media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.cpp b/media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.cpp index 875674b..bb5625f 100644 --- a/media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.cpp +++ b/media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.cpp @@ -76,6 +76,7 @@ SoftMPEG4::SoftMPEG4( mInitialized(false), mFramesConfigured(false), mNumSamplesOutput(0), + mPvTime(0), mOutputPortSettingsChange(NONE) { if (!strcmp(name, "OMX.google.h263.decoder")) { mMode = MODE_H263; @@ -415,9 +416,14 @@ void SoftMPEG4::onQueueFilled(OMX_U32 portIndex) { uint32_t useExtTimestamp = (inHeader->nOffset == 0); - // decoder deals in ms, OMX in us. - uint32_t timestamp = - useExtTimestamp ? (inHeader->nTimeStamp + 500) / 1000 : 0xFFFFFFFF; + // decoder deals in ms (int32_t), OMX in us (int64_t) + // so use fake timestamp instead + uint32_t timestamp = 0xFFFFFFFF; + if (useExtTimestamp) { + mPvToOmxTimeMap.add(mPvTime, inHeader->nTimeStamp); + timestamp = mPvTime; + mPvTime++; + } int32_t bufferSize = inHeader->nFilledLen; int32_t tmp = bufferSize; @@ -441,7 +447,8 @@ void SoftMPEG4::onQueueFilled(OMX_U32 portIndex) { } // decoder deals in ms, OMX in us. - outHeader->nTimeStamp = timestamp * 1000; + outHeader->nTimeStamp = mPvToOmxTimeMap.valueFor(timestamp); + mPvToOmxTimeMap.removeItem(timestamp); inHeader->nOffset += bufferSize; inHeader->nFilledLen = 0; @@ -572,6 +579,7 @@ void SoftMPEG4::onPortEnableCompleted(OMX_U32 portIndex, bool enabled) { } void SoftMPEG4::onReset() { + mPvToOmxTimeMap.clear(); mSignalledError = false; mOutputPortSettingsChange = NONE; mFramesConfigured = false; diff --git a/media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.h b/media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.h index 6df4c92..f71ccef 100644 --- a/media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.h +++ b/media/libstagefright/codecs/m4v_h263/dec/SoftMPEG4.h @@ -19,6 +19,7 @@ #define SOFT_MPEG4_H_ #include "SimpleSoftOMXComponent.h" +#include struct tagvideoDecControls; @@ -70,6 +71,8 @@ private: bool mFramesConfigured; int32_t mNumSamplesOutput; + int32_t mPvTime; + KeyedVector mPvToOmxTimeMap; enum { NONE, -- cgit v1.1