Merge change 22646 into eclair

* changes:
  Make sure not to ask for more buffers when we know that there won't be any, added a quirk for the aac decoder.
This commit is contained in:
Android (Google) Code Review
2009-08-25 14:35:12 -07:00
2 changed files with 44 additions and 5 deletions

View File

@@ -82,6 +82,7 @@ private:
kWantsNALFragments = 2, kWantsNALFragments = 2,
kRequiresLoadedToIdleAfterAllocation = 4, kRequiresLoadedToIdleAfterAllocation = 4,
kRequiresAllocateBufferOnInputPorts = 8, kRequiresAllocateBufferOnInputPorts = 8,
kRequiresFlushCompleteEmulation = 16,
}; };
struct BufferInfo { struct BufferInfo {
@@ -165,7 +166,13 @@ private:
void drainInputBuffers(); void drainInputBuffers();
void fillOutputBuffers(); void fillOutputBuffers();
void flushPortAsync(OMX_U32 portIndex); // Returns true iff a flush was initiated and a completion event is
// upcoming, false otherwise (A flush was not necessary as we own all
// the buffers on that port).
// This method will ONLY ever return false for a component with quirk
// "kRequiresFlushCompleteEmulation".
bool flushPortAsync(OMX_U32 portIndex);
void disablePortAsync(OMX_U32 portIndex); void disablePortAsync(OMX_U32 portIndex);
void enablePortAsync(OMX_U32 portIndex); void enablePortAsync(OMX_U32 portIndex);

View File

@@ -193,6 +193,7 @@ sp<OMXCodec> OMXCodec::Create(
} }
if (!strcmp(componentName, "OMX.TI.AAC.decode")) { if (!strcmp(componentName, "OMX.TI.AAC.decode")) {
quirks |= kNeedsFlushBeforeDisable; quirks |= kNeedsFlushBeforeDisable;
quirks |= kRequiresFlushCompleteEmulation;
} }
if (!strncmp(componentName, "OMX.qcom.video.encoder.", 23)) { if (!strncmp(componentName, "OMX.qcom.video.encoder.", 23)) {
quirks |= kRequiresLoadedToIdleAfterAllocation; quirks |= kRequiresLoadedToIdleAfterAllocation;
@@ -1163,21 +1164,38 @@ void OMXCodec::onPortSettingsChanged(OMX_U32 portIndex) {
setState(RECONFIGURING); setState(RECONFIGURING);
if (mQuirks & kNeedsFlushBeforeDisable) { if (mQuirks & kNeedsFlushBeforeDisable) {
flushPortAsync(portIndex); if (!flushPortAsync(portIndex)) {
onCmdComplete(OMX_CommandFlush, portIndex);
}
} else { } else {
disablePortAsync(portIndex); disablePortAsync(portIndex);
} }
} }
void OMXCodec::flushPortAsync(OMX_U32 portIndex) { bool OMXCodec::flushPortAsync(OMX_U32 portIndex) {
CHECK(mState == EXECUTING || mState == RECONFIGURING); CHECK(mState == EXECUTING || mState == RECONFIGURING);
LOGV("flushPortAsync(%ld): we own %d out of %d buffers already.",
portIndex, countBuffersWeOwn(mPortBuffers[portIndex]),
mPortBuffers[portIndex].size());
CHECK_EQ(mPortStatus[portIndex], ENABLED); CHECK_EQ(mPortStatus[portIndex], ENABLED);
mPortStatus[portIndex] = SHUTTING_DOWN; mPortStatus[portIndex] = SHUTTING_DOWN;
if ((mQuirks & kRequiresFlushCompleteEmulation)
&& countBuffersWeOwn(mPortBuffers[portIndex])
== mPortBuffers[portIndex].size()) {
// No flush is necessary and this component fails to send a
// flush-complete event in this case.
return false;
}
status_t err = status_t err =
mOMX->send_command(mNode, OMX_CommandFlush, portIndex); mOMX->send_command(mNode, OMX_CommandFlush, portIndex);
CHECK_EQ(err, OK); CHECK_EQ(err, OK);
return true;
} }
void OMXCodec::disablePortAsync(OMX_U32 portIndex) { void OMXCodec::disablePortAsync(OMX_U32 portIndex) {
@@ -1323,6 +1341,12 @@ void OMXCodec::drainInputBuffer(BufferInfo *info) {
void OMXCodec::fillOutputBuffer(BufferInfo *info) { void OMXCodec::fillOutputBuffer(BufferInfo *info) {
CHECK_EQ(info->mOwnedByComponent, false); CHECK_EQ(info->mOwnedByComponent, false);
if (mNoMoreOutputData) {
LOGV("There is no more output data available, not "
"calling fillOutputBuffer");
return;
}
LOGV("Calling fill_buffer on buffer %p", info->mBuffer); LOGV("Calling fill_buffer on buffer %p", info->mBuffer);
mOMX->fill_buffer(mNode, info->mBuffer); mOMX->fill_buffer(mNode, info->mBuffer);
@@ -1648,8 +1672,16 @@ status_t OMXCodec::read(
CHECK_EQ(mState, EXECUTING); CHECK_EQ(mState, EXECUTING);
flushPortAsync(kPortIndexInput); bool emulateInputFlushCompletion = !flushPortAsync(kPortIndexInput);
flushPortAsync(kPortIndexOutput); bool emulateOutputFlushCompletion = !flushPortAsync(kPortIndexOutput);
if (emulateInputFlushCompletion) {
onCmdComplete(OMX_CommandFlush, kPortIndexInput);
}
if (emulateOutputFlushCompletion) {
onCmdComplete(OMX_CommandFlush, kPortIndexOutput);
}
} }
while (mState != ERROR && !mNoMoreOutputData && mFilledBuffers.empty()) { while (mState != ERROR && !mNoMoreOutputData && mFilledBuffers.empty()) {