diff --git a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp index 9773cb00b9..6bc72bfee3 100644 --- a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp +++ b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp @@ -482,6 +482,21 @@ void portReconfiguration(sp omxNode, sp 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 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 omxNode, sp 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::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);