am e0daf804: Merge change 22921 into eclair

Merge commit 'e0daf8043fd4a9be995ff737d217b7b3514d4519' into eclair-plus-aosp

* commit 'e0daf8043fd4a9be995ff737d217b7b3514d4519':
  An attempt to fix a deadlock between OMXCodec::start and upstream ::read
This commit is contained in:
Andreas Huber
2009-08-27 11:21:02 -07:00
committed by Android Git Automerger
2 changed files with 18 additions and 3 deletions

View File

@@ -116,6 +116,7 @@ private:
State mState; State mState;
Vector<BufferInfo> mPortBuffers[2]; Vector<BufferInfo> mPortBuffers[2];
PortStatus mPortStatus[2]; PortStatus mPortStatus[2];
bool mInitialBufferSubmit;
bool mSignalledEOS; bool mSignalledEOS;
bool mNoMoreOutputData; bool mNoMoreOutputData;
int64_t mSeekTimeUs; int64_t mSeekTimeUs;

View File

@@ -634,6 +634,7 @@ OMXCodec::OMXCodec(
mSource(source), mSource(source),
mCodecSpecificDataIndex(0), mCodecSpecificDataIndex(0),
mState(LOADED), mState(LOADED),
mInitialBufferSubmit(true),
mSignalledEOS(false), mSignalledEOS(false),
mNoMoreOutputData(false), mNoMoreOutputData(false),
mSeekTimeUs(-1) { mSeekTimeUs(-1) {
@@ -666,7 +667,7 @@ OMXCodec::~OMXCodec() {
} }
status_t OMXCodec::init() { status_t OMXCodec::init() {
Mutex::Autolock autoLock(mLock); // mLock is held.
CHECK_EQ(mState, LOADED); CHECK_EQ(mState, LOADED);
@@ -1107,8 +1108,11 @@ void OMXCodec::onStateChange(OMX_STATETYPE newState) {
setState(EXECUTING); setState(EXECUTING);
drainInputBuffers(); // Buffers will be submitted to the component in the first
fillOutputBuffers(); // call to OMXCodec::read as mInitialBufferSubmit is true at
// this point. This ensures that this on_message call returns,
// releases the lock and ::init can notice the state change and
// itself return.
break; break;
} }
@@ -1603,6 +1607,8 @@ void OMXCodec::clearCodecSpecificData() {
} }
status_t OMXCodec::start(MetaData *) { status_t OMXCodec::start(MetaData *) {
Mutex::Autolock autoLock(mLock);
if (mState != LOADED) { if (mState != LOADED) {
return UNKNOWN_ERROR; return UNKNOWN_ERROR;
} }
@@ -1618,6 +1624,7 @@ status_t OMXCodec::start(MetaData *) {
} }
mCodecSpecificDataIndex = 0; mCodecSpecificDataIndex = 0;
mInitialBufferSubmit = true;
mSignalledEOS = false; mSignalledEOS = false;
mNoMoreOutputData = false; mNoMoreOutputData = false;
mSeekTimeUs = -1; mSeekTimeUs = -1;
@@ -1699,6 +1706,13 @@ status_t OMXCodec::read(
Mutex::Autolock autoLock(mLock); Mutex::Autolock autoLock(mLock);
if (mInitialBufferSubmit) {
mInitialBufferSubmit = false;
drainInputBuffers();
fillOutputBuffers();
}
if (mState != EXECUTING && mState != RECONFIGURING) { if (mState != EXECUTING && mState != RECONFIGURING) {
return UNKNOWN_ERROR; return UNKNOWN_ERROR;
} }