Merge "ACodec: handle state machine being stuck"

gugelfrei
TreeHugger Robot 6 years ago committed by Android (Google) Code Review
commit a28995460a

@ -5556,6 +5556,11 @@ bool ACodec::BaseState::onMessageReceived(const sp<AMessage> &msg) {
break;
}
case kWhatCheckIfStuck: {
ALOGV("No-op by default");
break;
}
default:
return false;
}
@ -7873,6 +7878,18 @@ bool ACodec::OutputPortSettingsChangedState::onMessageReceived(
break;
}
case kWhatCheckIfStuck:
{
int32_t generation = 0;
CHECK(msg->findInt32("generation", &generation));
if (generation == mCodec->mStateGeneration) {
mCodec->signalError(OMX_ErrorUndefined, TIMED_OUT);
}
handled = true;
break;
}
default:
handled = BaseState::onMessageReceived(msg);
break;
@ -7884,6 +7901,11 @@ bool ACodec::OutputPortSettingsChangedState::onMessageReceived(
void ACodec::OutputPortSettingsChangedState::stateEntered() {
ALOGV("[%s] Now handling output port settings change",
mCodec->mComponentName.c_str());
// If we haven't transitioned after 3 seconds, we're probably stuck.
sp<AMessage> msg = new AMessage(ACodec::kWhatCheckIfStuck, mCodec);
msg->setInt32("generation", mCodec->mStateGeneration);
msg->post(3000000);
}
bool ACodec::OutputPortSettingsChangedState::onOMXFrameRendered(
@ -8146,6 +8168,11 @@ void ACodec::FlushingState::stateEntered() {
ALOGV("[%s] Now Flushing", mCodec->mComponentName.c_str());
mFlushComplete[kPortIndexInput] = mFlushComplete[kPortIndexOutput] = false;
// If we haven't transitioned after 3 seconds, we're probably stuck.
sp<AMessage> msg = new AMessage(ACodec::kWhatCheckIfStuck, mCodec);
msg->setInt32("generation", mCodec->mStateGeneration);
msg->post(3000000);
}
bool ACodec::FlushingState::onMessageReceived(const sp<AMessage> &msg) {
@ -8160,6 +8187,7 @@ bool ACodec::FlushingState::onMessageReceived(const sp<AMessage> &msg) {
msg->setInt32("generation", mCodec->mStateGeneration);
msg->post(3000000);
}
handled = true;
break;
}
@ -8180,6 +8208,18 @@ bool ACodec::FlushingState::onMessageReceived(const sp<AMessage> &msg) {
break;
}
case kWhatCheckIfStuck:
{
int32_t generation = 0;
CHECK(msg->findInt32("generation", &generation));
if (generation == mCodec->mStateGeneration) {
mCodec->signalError(OMX_ErrorUndefined, TIMED_OUT);
}
handled = true;
break;
}
default:
handled = BaseState::onMessageReceived(msg);
break;

@ -137,6 +137,7 @@ private:
kWhatOMXDied = 'OMXd',
kWhatReleaseCodecInstance = 'relC',
kWhatForceStateTransition = 'fstt',
kWhatCheckIfStuck = 'Cstk',
};
enum {

Loading…
Cancel
Save