mirror of
https://github.com/Evolution-X/hardware_interfaces
synced 2026-02-01 11:36:00 +00:00
improve timeout handling
1. Maintaining large delays between successive input/output queue calls unnecessarily increases execution duration of the application. This is brought down to 2ms. 2. Flush and EOS sends events via callback. So offer them some leeway by increasing their timeout 3. No response breakout is changed to 5sec. 4. bug fix: decrement twice with in a loop removed Change-Id: I37dbee0dbdc79044beced89077f6ef46c7075e9f
This commit is contained in:
committed by
Pawin Vongmasa
parent
f706af8d57
commit
df47955adf
@@ -588,12 +588,12 @@ void waitOnInputConsumption(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
|
||||
AudioDecHidlTest::standardComp comp) {
|
||||
android::hardware::media::omx::V1_0::Status status;
|
||||
Message msg;
|
||||
int timeOut = TIMEOUT_COUNTER;
|
||||
int timeOut = TIMEOUT_COUNTER_Q;
|
||||
|
||||
while (timeOut--) {
|
||||
size_t i = 0;
|
||||
status =
|
||||
observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer);
|
||||
observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_Q, iBuffer, oBuffer);
|
||||
if (status == android::hardware::media::omx::V1_0::Status::OK) {
|
||||
EXPECT_EQ(msg.type, Message::Type::EVENT);
|
||||
packedArgs audioArgs = {eEncoding, comp};
|
||||
@@ -613,8 +613,8 @@ void waitOnInputConsumption(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
|
||||
size_t index;
|
||||
if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) {
|
||||
dispatchOutputBuffer(omxNode, oBuffer, index);
|
||||
timeOut = TIMEOUT_COUNTER_Q;
|
||||
}
|
||||
timeOut--;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -654,11 +654,12 @@ void decodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
|
||||
frameID++;
|
||||
}
|
||||
|
||||
int timeOut = TIMEOUT_COUNTER;
|
||||
bool stall = false;
|
||||
int timeOut = TIMEOUT_COUNTER_Q;
|
||||
bool iQueued, oQueued;
|
||||
while (1) {
|
||||
iQueued = oQueued = false;
|
||||
status =
|
||||
observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer);
|
||||
observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_Q, iBuffer, oBuffer);
|
||||
|
||||
// Port Reconfiguration
|
||||
if (status == android::hardware::media::omx::V1_0::Status::OK &&
|
||||
@@ -688,18 +689,16 @@ void decodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
|
||||
(*Info)[frameID].bytesCount, flags,
|
||||
(*Info)[frameID].timestamp);
|
||||
frameID++;
|
||||
stall = false;
|
||||
} else
|
||||
stall = true;
|
||||
iQueued = true;
|
||||
}
|
||||
if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) {
|
||||
dispatchOutputBuffer(omxNode, oBuffer, index);
|
||||
stall = false;
|
||||
} else
|
||||
stall = true;
|
||||
if (stall)
|
||||
timeOut--;
|
||||
oQueued = true;
|
||||
}
|
||||
if (iQueued || oQueued)
|
||||
timeOut = TIMEOUT_COUNTER_Q;
|
||||
else
|
||||
timeOut = TIMEOUT_COUNTER;
|
||||
timeOut--;
|
||||
if (timeOut == 0) {
|
||||
EXPECT_TRUE(false) << "Wait on Input/Output is found indefinite";
|
||||
break;
|
||||
@@ -1149,9 +1148,8 @@ TEST_F(AudioDecHidlTest, FlushTest) {
|
||||
decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, eEncoding,
|
||||
kPortIndexInput, kPortIndexOutput, eleStream, &Info, 0,
|
||||
nFrames, compName, false);
|
||||
// Note: Assumes 200 ms is enough to end any decode call that started
|
||||
flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
|
||||
kPortIndexOutput, 200000);
|
||||
kPortIndexOutput);
|
||||
framesReceived = 0;
|
||||
|
||||
// Seek to next key frame and start decoding till the end
|
||||
@@ -1172,9 +1170,8 @@ TEST_F(AudioDecHidlTest, FlushTest) {
|
||||
kPortIndexInput, kPortIndexOutput, eleStream, &Info,
|
||||
index, Info.size() - index, compName, false);
|
||||
}
|
||||
// Note: Assumes 200 ms is enough to end any decode call that started
|
||||
flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
|
||||
kPortIndexOutput, 200000);
|
||||
kPortIndexOutput);
|
||||
framesReceived = 0;
|
||||
|
||||
// set state to idle
|
||||
|
||||
@@ -342,12 +342,12 @@ void waitOnInputConsumption(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
|
||||
android::Vector<BufferInfo>* oBuffer) {
|
||||
android::hardware::media::omx::V1_0::Status status;
|
||||
Message msg;
|
||||
int timeOut = TIMEOUT_COUNTER;
|
||||
int timeOut = TIMEOUT_COUNTER_Q;
|
||||
|
||||
while (timeOut--) {
|
||||
size_t i = 0;
|
||||
status =
|
||||
observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer);
|
||||
observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_Q, iBuffer, oBuffer);
|
||||
EXPECT_EQ(status,
|
||||
android::hardware::media::omx::V1_0::Status::TIMED_OUT);
|
||||
// status == TIMED_OUT, it could be due to process time being large
|
||||
@@ -362,8 +362,8 @@ void waitOnInputConsumption(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
|
||||
size_t index;
|
||||
if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) {
|
||||
dispatchOutputBuffer(omxNode, oBuffer, index);
|
||||
timeOut = TIMEOUT_COUNTER_Q;
|
||||
}
|
||||
timeOut--;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -400,11 +400,12 @@ void encodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
|
||||
nFrames--;
|
||||
}
|
||||
|
||||
int timeOut = TIMEOUT_COUNTER;
|
||||
bool stall = false;
|
||||
int timeOut = TIMEOUT_COUNTER_Q;
|
||||
bool iQueued, oQueued;
|
||||
while (1) {
|
||||
iQueued = oQueued = false;
|
||||
status =
|
||||
observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer);
|
||||
observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_Q, iBuffer, oBuffer);
|
||||
|
||||
if (status == android::hardware::media::omx::V1_0::Status::OK)
|
||||
ASSERT_TRUE(false);
|
||||
@@ -425,19 +426,17 @@ void encodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
|
||||
timestamp);
|
||||
timestamp += timestampIncr;
|
||||
nFrames--;
|
||||
stall = false;
|
||||
} else
|
||||
stall = true;
|
||||
iQueued = true;
|
||||
}
|
||||
// Dispatch output buffer
|
||||
if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) {
|
||||
dispatchOutputBuffer(omxNode, oBuffer, index);
|
||||
stall = false;
|
||||
} else
|
||||
stall = true;
|
||||
if (stall)
|
||||
timeOut--;
|
||||
oQueued = true;
|
||||
}
|
||||
if (iQueued || oQueued)
|
||||
timeOut = TIMEOUT_COUNTER_Q;
|
||||
else
|
||||
timeOut = TIMEOUT_COUNTER;
|
||||
timeOut--;
|
||||
if (timeOut == 0) {
|
||||
EXPECT_TRUE(false) << "Wait on Input/Output is found indefinite";
|
||||
break;
|
||||
|
||||
@@ -532,7 +532,7 @@ void testEOS(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
|
||||
}
|
||||
}
|
||||
|
||||
int timeOut = TIMEOUT_COUNTER;
|
||||
int timeOut = TIMEOUT_COUNTER_PE;
|
||||
while (timeOut--) {
|
||||
// Dispatch all client owned output buffers to recover remaining frames
|
||||
while (1) {
|
||||
@@ -541,15 +541,15 @@ void testEOS(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
|
||||
// if dispatch is successful, perhaps there is a latency
|
||||
// in the component. Dont be in a haste to leave. reset timeout
|
||||
// counter
|
||||
timeOut = TIMEOUT_COUNTER;
|
||||
timeOut = TIMEOUT_COUNTER_PE;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Message msg;
|
||||
status =
|
||||
observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer);
|
||||
status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_PE, iBuffer,
|
||||
oBuffer);
|
||||
if (status == android::hardware::media::omx::V1_0::Status::OK) {
|
||||
if (msg.data.eventData.event == OMX_EventPortSettingsChanged) {
|
||||
if (fptr) {
|
||||
|
||||
@@ -33,8 +33,21 @@
|
||||
#include <media/openmax/OMX_AudioExt.h>
|
||||
#include <media/openmax/OMX_VideoExt.h>
|
||||
|
||||
/* TIME OUTS (Wait time in dequeueMessage()) */
|
||||
|
||||
/* As component is switching states (loaded<->idle<->execute), dequeueMessage()
|
||||
* expects the events to be received within this duration */
|
||||
#define DEFAULT_TIMEOUT 100000
|
||||
#define TIMEOUT_COUNTER (10000000 / DEFAULT_TIMEOUT)
|
||||
/* Time interval between successive Input/Output enqueues */
|
||||
#define DEFAULT_TIMEOUT_Q 2000
|
||||
/* While the component is amidst a process call, asynchronous commands like
|
||||
* flush, change states can get delayed (at max by process call time). Instead
|
||||
* of waiting on DEFAULT_TIMEOUT, we give an additional leeway. */
|
||||
#define DEFAULT_TIMEOUT_PE 500000
|
||||
|
||||
/* Breakout Timeout :: 5 sec*/
|
||||
#define TIMEOUT_COUNTER_Q (5000000 / DEFAULT_TIMEOUT_Q)
|
||||
#define TIMEOUT_COUNTER_PE (5000000 / DEFAULT_TIMEOUT_PE)
|
||||
|
||||
/*
|
||||
* Random Index used for monkey testing while get/set parameters
|
||||
@@ -310,7 +323,8 @@ void dispatchInputBuffer(sp<IOmxNode> omxNode,
|
||||
void flushPorts(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
|
||||
android::Vector<BufferInfo>* iBuffer,
|
||||
android::Vector<BufferInfo>* oBuffer, OMX_U32 kPortIndexInput,
|
||||
OMX_U32 kPortIndexOutput, int64_t timeoutUs = DEFAULT_TIMEOUT);
|
||||
OMX_U32 kPortIndexOutput,
|
||||
int64_t timeoutUs = DEFAULT_TIMEOUT_PE);
|
||||
|
||||
typedef void (*portreconfig)(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
|
||||
android::Vector<BufferInfo>* iBuffer,
|
||||
|
||||
@@ -604,12 +604,12 @@ void waitOnInputConsumption(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
|
||||
PortMode oPortMode) {
|
||||
android::hardware::media::omx::V1_0::Status status;
|
||||
Message msg;
|
||||
int timeOut = TIMEOUT_COUNTER;
|
||||
int timeOut = TIMEOUT_COUNTER_Q;
|
||||
|
||||
while (timeOut--) {
|
||||
size_t i = 0;
|
||||
status =
|
||||
observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer);
|
||||
observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_Q, iBuffer, oBuffer);
|
||||
if (status == android::hardware::media::omx::V1_0::Status::OK) {
|
||||
EXPECT_EQ(msg.type, Message::Type::EVENT);
|
||||
portReconfiguration(omxNode, observer, iBuffer, oBuffer,
|
||||
@@ -628,8 +628,8 @@ void waitOnInputConsumption(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
|
||||
size_t index;
|
||||
if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) {
|
||||
dispatchOutputBuffer(omxNode, oBuffer, index, oPortMode);
|
||||
timeOut = TIMEOUT_COUNTER_Q;
|
||||
}
|
||||
timeOut--;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -669,11 +669,12 @@ void decodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
|
||||
frameID++;
|
||||
}
|
||||
|
||||
int timeOut = TIMEOUT_COUNTER;
|
||||
bool stall = false;
|
||||
int timeOut = TIMEOUT_COUNTER_Q;
|
||||
bool iQueued, oQueued;
|
||||
while (1) {
|
||||
iQueued = oQueued = false;
|
||||
status =
|
||||
observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer);
|
||||
observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_Q, iBuffer, oBuffer);
|
||||
|
||||
// Port Reconfiguration
|
||||
if (status == android::hardware::media::omx::V1_0::Status::OK &&
|
||||
@@ -702,18 +703,16 @@ void decodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
|
||||
(*Info)[frameID].bytesCount, flags,
|
||||
(*Info)[frameID].timestamp);
|
||||
frameID++;
|
||||
stall = false;
|
||||
} else
|
||||
stall = true;
|
||||
iQueued = true;
|
||||
}
|
||||
if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) {
|
||||
dispatchOutputBuffer(omxNode, oBuffer, index, oPortMode);
|
||||
stall = false;
|
||||
} else
|
||||
stall = true;
|
||||
if (stall)
|
||||
timeOut--;
|
||||
oQueued = true;
|
||||
}
|
||||
if (iQueued || oQueued)
|
||||
timeOut = TIMEOUT_COUNTER_Q;
|
||||
else
|
||||
timeOut = TIMEOUT_COUNTER;
|
||||
timeOut--;
|
||||
if (timeOut == 0) {
|
||||
EXPECT_TRUE(false) << "Wait on Input/Output is found indefinite";
|
||||
break;
|
||||
@@ -1165,9 +1164,8 @@ TEST_F(VideoDecHidlTest, FlushTest) {
|
||||
decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
|
||||
kPortIndexOutput, eleStream, &Info, 0, nFrames, portMode[1],
|
||||
false);
|
||||
// Note: Assumes 200 ms is enough to end any decode call that started
|
||||
flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
|
||||
kPortIndexOutput, 200000);
|
||||
kPortIndexOutput);
|
||||
framesReceived = 0;
|
||||
|
||||
// Seek to next key frame and start decoding till the end
|
||||
@@ -1188,9 +1186,8 @@ TEST_F(VideoDecHidlTest, FlushTest) {
|
||||
kPortIndexOutput, eleStream, &Info, index,
|
||||
Info.size() - index, portMode[1], false);
|
||||
}
|
||||
// Note: Assumes 200 ms is enough to end any decode call that started
|
||||
flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
|
||||
kPortIndexOutput, 200000);
|
||||
kPortIndexOutput);
|
||||
framesReceived = 0;
|
||||
|
||||
// set state to idle
|
||||
|
||||
@@ -612,12 +612,12 @@ void waitOnInputConsumption(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
|
||||
sp<CodecProducerListener> listener = nullptr) {
|
||||
android::hardware::media::omx::V1_0::Status status;
|
||||
Message msg;
|
||||
int timeOut = TIMEOUT_COUNTER;
|
||||
int timeOut = TIMEOUT_COUNTER_Q;
|
||||
|
||||
while (timeOut--) {
|
||||
size_t i = 0;
|
||||
status =
|
||||
observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer);
|
||||
observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_Q, iBuffer, oBuffer);
|
||||
EXPECT_EQ(status,
|
||||
android::hardware::media::omx::V1_0::Status::TIMED_OUT);
|
||||
// status == TIMED_OUT, it could be due to process time being large
|
||||
@@ -636,6 +636,7 @@ void waitOnInputConsumption(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
|
||||
size_t index;
|
||||
if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) {
|
||||
dispatchOutputBuffer(omxNode, oBuffer, index);
|
||||
timeOut = TIMEOUT_COUNTER_Q;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1027,11 +1028,12 @@ void encodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
|
||||
}
|
||||
}
|
||||
|
||||
int timeOut = TIMEOUT_COUNTER;
|
||||
bool stall = false;
|
||||
int timeOut = TIMEOUT_COUNTER_Q;
|
||||
bool iQueued, oQueued;
|
||||
while (1) {
|
||||
iQueued = oQueued = false;
|
||||
status =
|
||||
observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer);
|
||||
observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_Q, iBuffer, oBuffer);
|
||||
|
||||
if (status == android::hardware::media::omx::V1_0::Status::OK) {
|
||||
ASSERT_EQ(msg.type, Message::Type::EVENT);
|
||||
@@ -1062,9 +1064,7 @@ void encodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
|
||||
timestamp += timestampIncr;
|
||||
nFrames--;
|
||||
ipCount++;
|
||||
stall = false;
|
||||
} else {
|
||||
stall = true;
|
||||
iQueued = true;
|
||||
}
|
||||
} else {
|
||||
if ((index = getEmptyBufferID(iBuffer)) < iBuffer->size()) {
|
||||
@@ -1083,20 +1083,17 @@ void encodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
|
||||
timestamp += timestampIncr;
|
||||
nFrames--;
|
||||
ipCount++;
|
||||
stall = false;
|
||||
} else {
|
||||
stall = true;
|
||||
iQueued = true;
|
||||
}
|
||||
}
|
||||
if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) {
|
||||
dispatchOutputBuffer(omxNode, oBuffer, index);
|
||||
stall = false;
|
||||
} else
|
||||
stall = true;
|
||||
if (stall)
|
||||
timeOut--;
|
||||
oQueued = true;
|
||||
}
|
||||
if (iQueued || oQueued)
|
||||
timeOut = TIMEOUT_COUNTER_Q;
|
||||
else
|
||||
timeOut = TIMEOUT_COUNTER;
|
||||
timeOut--;
|
||||
if (timeOut == 0) {
|
||||
EXPECT_TRUE(false) << "Wait on Input/Output is found indefinite";
|
||||
break;
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
#ifndef MEDIA_VIDEO_HIDL_TEST_COMMON_H
|
||||
#define MEDIA_VIDEO_HIDL_TEST_COMMON_H
|
||||
|
||||
|
||||
/*
|
||||
* Common video utils
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user