summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2011-02-08 13:15:37 -0800
committerAndroid (Google) Code Review <android-gerrit@google.com>2011-02-08 13:15:37 -0800
commiteeffad65d2db4879593c1d4806824ef5b4dcb3e1 (patch)
treeac530db863d4030d084c0a383317dce8fe879d64 /media
parentcd334d7a8e9df05f6b94eefbad2bddda0850f2cf (diff)
parent9c0096378820e5a61db26e52a7e6df50ba9c872d (diff)
downloadframeworks_av-eeffad65d2db4879593c1d4806824ef5b4dcb3e1.zip
frameworks_av-eeffad65d2db4879593c1d4806824ef5b4dcb3e1.tar.gz
frameworks_av-eeffad65d2db4879593c1d4806824ef5b4dcb3e1.tar.bz2
Merge "Handle some edge cases when seeking while starting up OMXCodec"
Diffstat (limited to 'media')
-rw-r--r--media/libstagefright/OMXCodec.cpp28
1 files changed, 28 insertions, 0 deletions
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;