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:
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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()) {
|
||||||
|
|||||||
Reference in New Issue
Block a user