summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorLajos Molnar <lajos@google.com>2015-04-18 00:10:27 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2015-04-18 00:10:27 +0000
commit5030647ab3860575312532655ccf2ea3cc96088f (patch)
treee73b4b0a9c37c349b3349ee82824703296f94162 /media
parentdfe5c4217d440740b47567e05c73018b44d183cd (diff)
parent4c85e16c9f7cbd9e9fa4713d62ed2c7f4da2f7d3 (diff)
downloadframeworks_av-5030647ab3860575312532655ccf2ea3cc96088f.zip
frameworks_av-5030647ab3860575312532655ccf2ea3cc96088f.tar.gz
frameworks_av-5030647ab3860575312532655ccf2ea3cc96088f.tar.bz2
am 4c85e16c: am d2dc1ea3: am 88574352: am 7725022e: Merge "SoftMPEG2: start output at first I-frame"
* commit '4c85e16c9f7cbd9e9fa4713d62ed2c7f4da2f7d3': SoftMPEG2: start output at first I-frame
Diffstat (limited to 'media')
-rw-r--r--media/libstagefright/codecs/mpeg2dec/SoftMPEG2.cpp25
-rw-r--r--media/libstagefright/codecs/mpeg2dec/SoftMPEG2.h1
2 files changed, 21 insertions, 5 deletions
diff --git a/media/libstagefright/codecs/mpeg2dec/SoftMPEG2.cpp b/media/libstagefright/codecs/mpeg2dec/SoftMPEG2.cpp
index e382f4c..78b3ab4 100644
--- a/media/libstagefright/codecs/mpeg2dec/SoftMPEG2.cpp
+++ b/media/libstagefright/codecs/mpeg2dec/SoftMPEG2.cpp
@@ -245,6 +245,7 @@ status_t SoftMPEG2::setFlushMode() {
return UNKNOWN_ERROR;
}
+ mWaitForI = true;
mIsInFlush = true;
return OK;
}
@@ -257,6 +258,7 @@ status_t SoftMPEG2::initDecoder() {
UWORD32 u4_share_disp_buf;
mNumCores = GetCPUCoreCount();
+ mWaitForI = true;
/* Initialize number of ref and reorder modes (for MPEG2) */
u4_num_reorder_frames = 16;
@@ -448,6 +450,8 @@ status_t SoftMPEG2::reInitDecoder() {
void SoftMPEG2::onReset() {
SoftVideoDecoderOMXComponent::onReset();
+ mWaitForI = true;
+
resetDecoder();
resetPlugin();
}
@@ -710,11 +714,22 @@ void SoftMPEG2::onQueueFilled(OMX_U32 portIndex) {
outHeader->nTimeStamp = mTimeStamps[timeStampIdx];
mTimeStampsValid[timeStampIdx] = false;
- outInfo->mOwnedByUs = false;
- outQueue.erase(outQueue.begin());
- outInfo = NULL;
- notifyFillBufferDone(outHeader);
- outHeader = NULL;
+ /* mWaitForI waits for the first I picture. Once made FALSE, it
+ has to remain false till explicitly set to TRUE. */
+ mWaitForI = mWaitForI && !(IV_I_FRAME == s_dec_op.e_pic_type);
+
+ if (mWaitForI) {
+ s_dec_op.u4_output_present = false;
+ } else {
+ ALOGV("Output timestamp: %lld, res: %ux%u",
+ (long long)outHeader->nTimeStamp, mWidth, mHeight);
+ DUMP_TO_FILE(mOutFile, outHeader->pBuffer, outHeader->nFilledLen);
+ outInfo->mOwnedByUs = false;
+ outQueue.erase(outQueue.begin());
+ outInfo = NULL;
+ notifyFillBufferDone(outHeader);
+ outHeader = NULL;
+ }
} else {
/* If in flush mode and no output is returned by the codec,
* then come out of flush mode */
diff --git a/media/libstagefright/codecs/mpeg2dec/SoftMPEG2.h b/media/libstagefright/codecs/mpeg2dec/SoftMPEG2.h
index f7b1961..a625e08 100644
--- a/media/libstagefright/codecs/mpeg2dec/SoftMPEG2.h
+++ b/media/libstagefright/codecs/mpeg2dec/SoftMPEG2.h
@@ -105,6 +105,7 @@ private:
// codec. So the codec is switching to decode the new resolution.
bool mChangingResolution;
bool mFlushNeeded;
+ bool mWaitForI;
status_t initDecoder();
status_t deInitDecoder();