diff options
author | Andreas Huber <andih@google.com> | 2011-02-08 13:15:37 -0800 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-02-08 13:15:37 -0800 |
commit | 5ed9a80571ede30d4cb7967227bff996c9cecb9e (patch) | |
tree | f691e3a4ecf7053c14af2eba66e9ad375b955877 | |
parent | 357a9335c24ed0844187d9f8aace53acbca48c50 (diff) | |
parent | b9289833341ec19e016891d0ca9638f0973b9647 (diff) | |
download | frameworks_base-5ed9a80571ede30d4cb7967227bff996c9cecb9e.zip frameworks_base-5ed9a80571ede30d4cb7967227bff996c9cecb9e.tar.gz frameworks_base-5ed9a80571ede30d4cb7967227bff996c9cecb9e.tar.bz2 |
Merge "Handle some edge cases when seeking while starting up OMXCodec"
-rw-r--r-- | include/media/stagefright/OMXCodec.h | 1 | ||||
-rw-r--r-- | media/libstagefright/OMXCodec.cpp | 28 |
2 files changed, 29 insertions, 0 deletions
diff --git a/include/media/stagefright/OMXCodec.h b/include/media/stagefright/OMXCodec.h index 82948cb..f7d837a 100644 --- a/include/media/stagefright/OMXCodec.h +++ b/include/media/stagefright/OMXCodec.h @@ -175,6 +175,7 @@ private: int64_t mSeekTimeUs; ReadOptions::SeekMode mSeekMode; int64_t mTargetTimeUs; + bool mOutputPortSettingsChangedPending; MediaBuffer *mLeftOverBuffer; diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp index 247ace7..fccd68c 100644 --- a/media/libstagefright/OMXCodec.cpp +++ b/media/libstagefright/OMXCodec.cpp @@ -1434,6 +1434,7 @@ OMXCodec::OMXCodec( mSeekTimeUs(-1), mSeekMode(ReadOptions::SEEK_CLOSEST_SYNC), mTargetTimeUs(-1), + mOutputPortSettingsChangedPending(false), mLeftOverBuffer(NULL), mPaused(false), mNativeWindow(nativeWindow) { @@ -2344,6 +2345,14 @@ void OMXCodec::onCmdComplete(OMX_COMMANDTYPE cmd, OMX_U32 data) { drainInputBuffers(); fillOutputBuffers(); } + + if (mOutputPortSettingsChangedPending) { + CODEC_LOGV( + "Honoring deferred output port settings change."); + + mOutputPortSettingsChangedPending = false; + onPortSettingsChanged(kPortIndexOutput); + } } break; @@ -2407,6 +2416,8 @@ void OMXCodec::onStateChange(OMX_STATETYPE newState) { CODEC_LOGV("Now Executing."); + mOutputPortSettingsChangedPending = false; + setState(EXECUTING); // Buffers will be submitted to the component in the first @@ -2520,6 +2531,14 @@ void OMXCodec::onPortSettingsChanged(OMX_U32 portIndex) { CHECK_EQ((int)mState, (int)EXECUTING); CHECK_EQ(portIndex, (OMX_U32)kPortIndexOutput); + CHECK(!mOutputPortSettingsChangedPending); + + if (mPortStatus[kPortIndexOutput] != ENABLED) { + CODEC_LOGV("Deferring output port settings change."); + mOutputPortSettingsChangedPending = true; + return; + } + setState(RECONFIGURING); if (mQuirks & kNeedsFlushBeforeDisable) { @@ -2712,6 +2731,7 @@ bool OMXCodec::drainInputBuffer(BufferInfo *info) { if (srcBuffer->meta_data()->findInt64( kKeyTargetTime, &targetTimeUs) && targetTimeUs >= 0) { + CODEC_LOGV("targetTimeUs = %lld us", targetTimeUs); mTargetTimeUs = targetTimeUs; } else { mTargetTimeUs = -1; @@ -3385,6 +3405,14 @@ status_t OMXCodec::read( } if (seeking) { + while (mState == RECONFIGURING) { + mBufferFilled.wait(mLock); + } + + if (mState != EXECUTING) { + return UNKNOWN_ERROR; + } + CODEC_LOGV("seeking to %lld us (%.2f secs)", seekTimeUs, seekTimeUs / 1E6); mSignalledEOS = false; |