mirror of
https://github.com/Evolution-X/hardware_interfaces
synced 2026-02-01 16:50:18 +00:00
bug fix: handle OMX_EventBufferFlag events
am: c8df8940e1
Change-Id: Ifa9493d869e42a76100011d5af20c5062bc44891
This commit is contained in:
@@ -485,15 +485,20 @@ void GetURLForComponent(AudioDecHidlTest::standardComp comp, char* mURL,
|
||||
|
||||
// port settings reconfiguration during runtime. reconfigures sample rate and
|
||||
// number
|
||||
typedef struct {
|
||||
OMX_AUDIO_CODINGTYPE eEncoding;
|
||||
AudioDecHidlTest::standardComp comp;
|
||||
} packedArgs;
|
||||
void portReconfiguration(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
|
||||
android::Vector<BufferInfo>* iBuffer,
|
||||
android::Vector<BufferInfo>* oBuffer,
|
||||
OMX_AUDIO_CODINGTYPE eEncoding,
|
||||
OMX_U32 kPortIndexInput, OMX_U32 kPortIndexOutput,
|
||||
Message msg,
|
||||
AudioDecHidlTest::standardComp comp =
|
||||
AudioDecHidlTest::standardComp::unknown_comp) {
|
||||
Message msg, PortMode oPortMode, void* args) {
|
||||
android::hardware::media::omx::V1_0::Status status;
|
||||
packedArgs* audioArgs = static_cast<packedArgs*>(args);
|
||||
OMX_AUDIO_CODINGTYPE eEncoding = audioArgs->eEncoding;
|
||||
AudioDecHidlTest::standardComp comp = audioArgs->comp;
|
||||
(void)oPortMode;
|
||||
|
||||
if (msg.data.eventData.event == OMX_EventPortSettingsChanged) {
|
||||
ASSERT_EQ(msg.data.eventData.data1, kPortIndexOutput);
|
||||
@@ -579,7 +584,8 @@ void waitOnInputConsumption(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
|
||||
android::Vector<BufferInfo>* iBuffer,
|
||||
android::Vector<BufferInfo>* oBuffer,
|
||||
OMX_AUDIO_CODINGTYPE eEncoding,
|
||||
OMX_U32 kPortIndexInput, OMX_U32 kPortIndexOutput) {
|
||||
OMX_U32 kPortIndexInput, OMX_U32 kPortIndexOutput,
|
||||
AudioDecHidlTest::standardComp comp) {
|
||||
android::hardware::media::omx::V1_0::Status status;
|
||||
Message msg;
|
||||
int timeOut = TIMEOUT_COUNTER;
|
||||
@@ -590,8 +596,10 @@ void waitOnInputConsumption(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
|
||||
observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer);
|
||||
if (status == android::hardware::media::omx::V1_0::Status::OK) {
|
||||
EXPECT_EQ(msg.type, Message::Type::EVENT);
|
||||
portReconfiguration(omxNode, observer, iBuffer, oBuffer, eEncoding,
|
||||
kPortIndexInput, kPortIndexOutput, msg);
|
||||
packedArgs audioArgs = {eEncoding, comp};
|
||||
portReconfiguration(omxNode, observer, iBuffer, oBuffer,
|
||||
kPortIndexInput, kPortIndexOutput, msg,
|
||||
PortMode::PRESET_BYTE_BUFFER, &audioArgs);
|
||||
}
|
||||
// status == TIMED_OUT, it could be due to process time being large
|
||||
// than DEFAULT_TIMEOUT or component needs output buffers to start
|
||||
@@ -655,8 +663,10 @@ void decodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
|
||||
// Port Reconfiguration
|
||||
if (status == android::hardware::media::omx::V1_0::Status::OK &&
|
||||
msg.type == Message::Type::EVENT) {
|
||||
portReconfiguration(omxNode, observer, iBuffer, oBuffer, eEncoding,
|
||||
kPortIndexInput, kPortIndexOutput, msg, comp);
|
||||
packedArgs audioArgs = {eEncoding, comp};
|
||||
portReconfiguration(omxNode, observer, iBuffer, oBuffer,
|
||||
kPortIndexInput, kPortIndexOutput, msg,
|
||||
PortMode::PRESET_BYTE_BUFFER, &audioArgs);
|
||||
}
|
||||
|
||||
if (frameID == (int)Info->size() || frameID == (offset + range)) break;
|
||||
@@ -800,8 +810,10 @@ TEST_F(AudioDecHidlTest, DecodeTest) {
|
||||
(int)Info.size(), compName);
|
||||
eleStream.close();
|
||||
waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding,
|
||||
kPortIndexInput, kPortIndexOutput);
|
||||
testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag);
|
||||
kPortIndexInput, kPortIndexOutput, compName);
|
||||
packedArgs audioArgs = {eEncoding, compName};
|
||||
testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, nullptr,
|
||||
portReconfiguration, kPortIndexInput, kPortIndexOutput, &audioArgs);
|
||||
EXPECT_EQ(timestampUslist.empty(), true);
|
||||
// set state to idle
|
||||
changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
|
||||
@@ -857,7 +869,9 @@ TEST_F(AudioDecHidlTest, DISABLED_EOSTest_M) {
|
||||
changeStateIdletoExecute(omxNode, observer);
|
||||
|
||||
// request EOS at the start
|
||||
testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag);
|
||||
packedArgs audioArgs = {eEncoding, compName};
|
||||
testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, nullptr,
|
||||
portReconfiguration, kPortIndexInput, kPortIndexOutput, &audioArgs);
|
||||
flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
|
||||
kPortIndexOutput);
|
||||
EXPECT_GE(framesReceived, 0U);
|
||||
@@ -944,8 +958,10 @@ TEST_F(AudioDecHidlTest, ThumbnailTest) {
|
||||
compName);
|
||||
eleStream.close();
|
||||
waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding,
|
||||
kPortIndexInput, kPortIndexOutput);
|
||||
testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag);
|
||||
kPortIndexInput, kPortIndexOutput, compName);
|
||||
packedArgs audioArgs = {eEncoding, compName};
|
||||
testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, nullptr,
|
||||
portReconfiguration, kPortIndexInput, kPortIndexOutput, &audioArgs);
|
||||
flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
|
||||
kPortIndexOutput);
|
||||
EXPECT_GE(framesReceived, 1U);
|
||||
@@ -960,8 +976,9 @@ TEST_F(AudioDecHidlTest, ThumbnailTest) {
|
||||
compName, false);
|
||||
eleStream.close();
|
||||
waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding,
|
||||
kPortIndexInput, kPortIndexOutput);
|
||||
testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag);
|
||||
kPortIndexInput, kPortIndexOutput, compName);
|
||||
testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, nullptr,
|
||||
portReconfiguration, kPortIndexInput, kPortIndexOutput, &audioArgs);
|
||||
flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
|
||||
kPortIndexOutput);
|
||||
EXPECT_GE(framesReceived, 1U);
|
||||
@@ -1045,8 +1062,10 @@ TEST_F(AudioDecHidlTest, SimpleEOSTest) {
|
||||
(int)Info.size(), compName, false);
|
||||
eleStream.close();
|
||||
waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding,
|
||||
kPortIndexInput, kPortIndexOutput);
|
||||
testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag);
|
||||
kPortIndexInput, kPortIndexOutput, compName);
|
||||
packedArgs audioArgs = {eEncoding, compName};
|
||||
testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, nullptr,
|
||||
portReconfiguration, kPortIndexInput, kPortIndexOutput, &audioArgs);
|
||||
flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
|
||||
kPortIndexOutput);
|
||||
framesReceived = 0;
|
||||
|
||||
@@ -406,7 +406,8 @@ void flushPorts(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
|
||||
void testEOS(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
|
||||
android::Vector<BufferInfo>* iBuffer,
|
||||
android::Vector<BufferInfo>* oBuffer, bool signalEOS,
|
||||
bool& eosFlag, PortMode* portMode) {
|
||||
bool& eosFlag, PortMode* portMode, portreconfig fptr,
|
||||
OMX_U32 kPortIndexInput, OMX_U32 kPortIndexOutput, void* args) {
|
||||
android::hardware::media::omx::V1_0::Status status;
|
||||
PortMode defaultPortMode[2], *pm;
|
||||
|
||||
@@ -443,9 +444,15 @@ void testEOS(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
|
||||
status =
|
||||
observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer);
|
||||
if (status == android::hardware::media::omx::V1_0::Status::OK) {
|
||||
if (msg.data.eventData.event == OMX_EventBufferFlag) {
|
||||
// soft omx components donot send this, we will just ignore it
|
||||
// for now
|
||||
if (msg.data.eventData.event == OMX_EventPortSettingsChanged) {
|
||||
if (fptr) {
|
||||
(*fptr)(omxNode, observer, iBuffer, oBuffer,
|
||||
kPortIndexInput, kPortIndexOutput, msg, pm[1],
|
||||
args);
|
||||
} else {
|
||||
// something unexpected happened
|
||||
EXPECT_TRUE(false);
|
||||
}
|
||||
} else {
|
||||
// something unexpected happened
|
||||
EXPECT_TRUE(false);
|
||||
|
||||
@@ -113,6 +113,12 @@ struct CodecObserver : public IOmxObserver {
|
||||
android::hardware::media::omx::V1_0::Message::Type::EVENT) {
|
||||
*msg = *it;
|
||||
msgQueue.erase(it);
|
||||
// OMX_EventBufferFlag event is sent when the component has
|
||||
// processed a buffer with its EOS flag set. This event is
|
||||
// not sent by soft omx components. Vendor components can
|
||||
// send this. From IOMX point of view, we will ignore this
|
||||
// event.
|
||||
if (msg->data.eventData.event == OMX_EventBufferFlag) break;
|
||||
return ::android::hardware::media::omx::V1_0::Status::OK;
|
||||
} else if (it->type == android::hardware::media::omx::V1_0::
|
||||
Message::Type::FILL_BUFFER_DONE) {
|
||||
@@ -299,9 +305,16 @@ void flushPorts(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
|
||||
android::Vector<BufferInfo>* oBuffer, OMX_U32 kPortIndexInput,
|
||||
OMX_U32 kPortIndexOutput, int64_t timeoutUs = DEFAULT_TIMEOUT);
|
||||
|
||||
typedef void (*portreconfig)(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
|
||||
android::Vector<BufferInfo>* iBuffer,
|
||||
android::Vector<BufferInfo>* oBuffer,
|
||||
OMX_U32 kPortIndexInput, OMX_U32 kPortIndexOutput,
|
||||
Message msg, PortMode oPortMode, void* args);
|
||||
void testEOS(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
|
||||
android::Vector<BufferInfo>* iBuffer,
|
||||
android::Vector<BufferInfo>* oBuffer, bool signalEOS,
|
||||
bool& eosFlag, PortMode* portMode = nullptr);
|
||||
bool& eosFlag, PortMode* portMode = nullptr,
|
||||
portreconfig fptr = nullptr, OMX_U32 kPortIndexInput = 0,
|
||||
OMX_U32 kPortIndexOutput = 1, void* args = nullptr);
|
||||
|
||||
#endif // MEDIA_HIDL_TEST_COMMON_H
|
||||
|
||||
@@ -485,8 +485,9 @@ void portReconfiguration(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
|
||||
android::Vector<BufferInfo>* iBuffer,
|
||||
android::Vector<BufferInfo>* oBuffer,
|
||||
OMX_U32 kPortIndexInput, OMX_U32 kPortIndexOutput,
|
||||
Message msg, PortMode oPortMode) {
|
||||
Message msg, PortMode oPortMode, void* args) {
|
||||
android::hardware::media::omx::V1_0::Status status;
|
||||
(void)args;
|
||||
|
||||
if (msg.data.eventData.event == OMX_EventPortSettingsChanged) {
|
||||
ASSERT_EQ(msg.data.eventData.data1, kPortIndexOutput);
|
||||
@@ -586,9 +587,6 @@ void portReconfiguration(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
|
||||
std::cout << "[ ] Warning ! OMX_EventError/ "
|
||||
"Decode Frame Call might be failed \n";
|
||||
return;
|
||||
} else if (msg.data.eventData.event == OMX_EventBufferFlag) {
|
||||
// soft omx components donot send this, we will just ignore it
|
||||
// for now
|
||||
} else {
|
||||
// something unexpected happened
|
||||
ASSERT_TRUE(false);
|
||||
@@ -613,7 +611,7 @@ void waitOnInputConsumption(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
|
||||
EXPECT_EQ(msg.type, Message::Type::EVENT);
|
||||
portReconfiguration(omxNode, observer, iBuffer, oBuffer,
|
||||
kPortIndexInput, kPortIndexOutput, msg,
|
||||
oPortMode);
|
||||
oPortMode, nullptr);
|
||||
}
|
||||
// status == TIMED_OUT, it could be due to process time being large
|
||||
// than DEFAULT_TIMEOUT or component needs output buffers to start
|
||||
@@ -679,7 +677,7 @@ void decodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer,
|
||||
msg.type == Message::Type::EVENT) {
|
||||
portReconfiguration(omxNode, observer, iBuffer, oBuffer,
|
||||
kPortIndexInput, kPortIndexOutput, msg,
|
||||
oPortMode);
|
||||
oPortMode, nullptr);
|
||||
}
|
||||
|
||||
if (frameID == (int)Info->size() || frameID == (offset + range)) break;
|
||||
@@ -845,7 +843,8 @@ TEST_F(VideoDecHidlTest, DecodeTest) {
|
||||
eleStream.close();
|
||||
waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer,
|
||||
kPortIndexInput, kPortIndexOutput, portMode[1]);
|
||||
testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, portMode);
|
||||
testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, portMode,
|
||||
portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr);
|
||||
EXPECT_EQ(timestampUslist.empty(), true);
|
||||
// set state to idle
|
||||
changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer);
|
||||
@@ -895,7 +894,8 @@ TEST_F(VideoDecHidlTest, EOSTest_M) {
|
||||
changeStateIdletoExecute(omxNode, observer);
|
||||
|
||||
// request EOS at the start
|
||||
testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode);
|
||||
testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode,
|
||||
portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr);
|
||||
flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
|
||||
kPortIndexOutput);
|
||||
EXPECT_GE(framesReceived, 0U);
|
||||
@@ -979,7 +979,8 @@ TEST_F(VideoDecHidlTest, ThumbnailTest) {
|
||||
eleStream.close();
|
||||
waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer,
|
||||
kPortIndexInput, kPortIndexOutput, portMode[1]);
|
||||
testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, portMode);
|
||||
testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, portMode,
|
||||
portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr);
|
||||
flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
|
||||
kPortIndexOutput);
|
||||
EXPECT_GE(framesReceived, 1U);
|
||||
@@ -994,7 +995,8 @@ TEST_F(VideoDecHidlTest, ThumbnailTest) {
|
||||
eleStream.close();
|
||||
waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer,
|
||||
kPortIndexInput, kPortIndexOutput, portMode[1]);
|
||||
testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode);
|
||||
testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode,
|
||||
portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr);
|
||||
flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
|
||||
kPortIndexOutput);
|
||||
EXPECT_GE(framesReceived, 1U);
|
||||
@@ -1077,7 +1079,8 @@ TEST_F(VideoDecHidlTest, SimpleEOSTest) {
|
||||
eleStream.close();
|
||||
waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer,
|
||||
kPortIndexInput, kPortIndexOutput, portMode[1]);
|
||||
testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode);
|
||||
testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode,
|
||||
portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr);
|
||||
flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput,
|
||||
kPortIndexOutput);
|
||||
framesReceived = 0;
|
||||
|
||||
Reference in New Issue
Block a user