bug fix: handle multiple port settings change events signalled at once

Components can send various kinds of port settings changed events all
at once. During a full port reconfiguration this is causing problems
due to limited flexibility in the message handling design. For now,
before committing to a full port reconfiguration defer any events
waiting in the queue to be addressed to a later point.

Test: make vts -j99 BUILD_GOOGLE_VTS=true TARGET_PRODUCT=aosp_arm64 \
&& vts-tradefed run commandAndExit vts \
--skip-all-system-status-check --primary-abi-only \
--skip-preconditions --module VtsHalMediaOmxV1_0Test -l INFO

Bug: 64468705

Change-Id: I537cdd3e7d92cdc6d54168f091d7897afe541599
This commit is contained in:
Ram Mohan M
2017-08-29 14:08:47 +05:30
committed by Pawin Vongmasa
parent e2dae8c258
commit a230bad8d4

View File

@@ -482,6 +482,21 @@ void portReconfiguration(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
ASSERT_EQ(msg.data.eventData.data1, kPortIndexOutput);
if (msg.data.eventData.data2 == OMX_IndexParamPortDefinition ||
msg.data.eventData.data2 == 0) {
// Components can send various kinds of port settings changed events
// all at once. Before committing to a full port reconfiguration,
// defer any events waiting in the queue to be addressed to a later
// point.
android::List<Message> msgQueueDefer;
while (1) {
status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT,
iBuffer, oBuffer);
if (status !=
android::hardware::media::omx::V1_0::Status::TIMED_OUT) {
msgQueueDefer.push_back(msg);
continue;
} else
break;
}
status = omxNode->sendCommand(
toRawCommandType(OMX_CommandPortDisable), kPortIndexOutput);
ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK);
@@ -557,6 +572,16 @@ void portReconfiguration(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
ASSERT_EQ(msg.data.eventData.data1, OMX_CommandPortEnable);
ASSERT_EQ(msg.data.eventData.data2, kPortIndexOutput);
// Push back deferred messages to the list
android::List<Message>::iterator it = msgQueueDefer.begin();
while (it != msgQueueDefer.end()) {
status = omxNode->dispatchMessage(*it);
ASSERT_EQ(
status,
::android::hardware::media::omx::V1_0::Status::OK);
it++;
}
// dispatch output buffers
for (size_t i = 0; i < oBuffer->size(); i++) {
dispatchOutputBuffer(omxNode, oBuffer, i, oPortMode);