Loading media/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ subdirs = [ "1.0", "omx/1.0", "omx/1.0/vts/functional/audio", "omx/1.0/vts/functional/common", "omx/1.0/vts/functional/component", "omx/1.0/vts/functional/master", "omx/1.0/vts/functional/video", Loading media/omx/1.0/vts/functional/audio/Android.bp +4 −2 Original line number Diff line number Diff line Loading @@ -34,7 +34,8 @@ cc_test { "android.hidl.memory@1.0", "android.hardware.media.omx@1.0", ], static_libs: ["VtsHalHidlTargetTestBase"], static_libs: ["VtsHalHidlTargetTestBase", "VtsHalMediaOmxV1_0CommonUtil"], cflags: [ "-O0", "-g", Loading Loading @@ -65,7 +66,8 @@ cc_test { "android.hidl.memory@1.0", "android.hardware.media.omx@1.0", ], static_libs: ["VtsHalHidlTargetTestBase"], static_libs: ["VtsHalHidlTargetTestBase", "VtsHalMediaOmxV1_0CommonUtil"], cflags: [ "-O0", "-g", Loading media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp +45 −50 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ using ::android::hardware::media::omx::V1_0::IOmxObserver; using ::android::hardware::media::omx::V1_0::IOmxNode; using ::android::hardware::media::omx::V1_0::Message; using ::android::hardware::media::omx::V1_0::CodecBuffer; using ::android::hardware::media::omx::V1_0::PortMode; using ::android::hidl::allocator::V1_0::IAllocator; using ::android::hidl::memory::V1_0::IMemory; using ::android::hidl::memory::V1_0::IMapper; Loading Loading @@ -136,7 +137,9 @@ class AudioDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { gEnv->getInstance()); ASSERT_NE(omx, nullptr); observer = new CodecObserver([this](Message msg) { handleMessage(msg); }); new CodecObserver([this](Message msg, const BufferInfo* buffer) { handleMessage(msg, buffer); }); ASSERT_NE(observer, nullptr); if (strncmp(gEnv->getComponent().c_str(), "OMX.", 4) != 0) disableTest = true; Loading Loading @@ -218,7 +221,8 @@ class AudioDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { // callback function to process messages received by onMessages() from IL // client. void handleMessage(Message msg) { void handleMessage(Message msg, const BufferInfo* buffer) { (void)buffer; if (msg.type == Message::Type::FILL_BUFFER_DONE) { if (msg.data.extendedBufferData.flags & OMX_BUFFERFLAG_EOS) { eosFlag = true; Loading Loading @@ -254,12 +258,25 @@ class AudioDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { } } } #define WRITE_OUTPUT 0 #if WRITE_OUTPUT static int count = 0; FILE* ofp = nullptr; if (count) ofp = fopen("out.bin", "ab"); else ofp = fopen("out.bin", "wb"); if (ofp != nullptr) { fwrite(static_cast<void*>(buffer->mMemory->getPointer()), sizeof(char), msg.data.extendedBufferData.rangeLength, ofp); fclose(ofp); count++; } #endif } } } void testEOS(android::Vector<BufferInfo>* iBuffer, android::Vector<BufferInfo>* oBuffer, bool signalEOS = false); enum standardComp { mp3, Loading Loading @@ -294,44 +311,6 @@ class AudioDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { } }; // end of stream test for audio decoder components void AudioDecHidlTest::testEOS(android::Vector<BufferInfo>* iBuffer, android::Vector<BufferInfo>* oBuffer, bool signalEOS) { android::hardware::media::omx::V1_0::Status status; size_t i = 0; if (signalEOS) { if ((i = getEmptyBufferID(iBuffer)) < iBuffer->size()) { // signal an empty buffer with flag set to EOS dispatchInputBuffer(omxNode, iBuffer, i, 0, OMX_BUFFERFLAG_EOS, 0); } else { ASSERT_TRUE(false); } } // Dispatch all client owned output buffers to recover remaining frames while (1) { if ((i = getEmptyBufferID(oBuffer)) < oBuffer->size()) { dispatchOutputBuffer(omxNode, oBuffer, i); } else { break; } } while (1) { Message msg; status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); EXPECT_EQ(status, android::hardware::media::omx::V1_0::Status::TIMED_OUT); for (; i < iBuffer->size(); i++) { if ((*iBuffer)[i].owner != client) break; } if (i == iBuffer->size()) break; } // test for flag EXPECT_EQ(eosFlag, true); eosFlag = false; } // Set Default port param. void setDefaultPortParam( sp<IOmxNode> omxNode, OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE eEncoding, Loading Loading @@ -580,8 +559,9 @@ void waitOnInputConsumption(sp<IOmxNode> omxNode, sp<CodecObserver> observer, OMX_U32 kPortIndexInput, OMX_U32 kPortIndexOutput) { android::hardware::media::omx::V1_0::Status status; Message msg; int timeOut = TIMEOUT_COUNTER; while (1) { while (timeOut--) { size_t i = 0; status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); Loading @@ -603,6 +583,7 @@ void waitOnInputConsumption(sp<IOmxNode> omxNode, sp<CodecObserver> observer, if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { dispatchOutputBuffer(omxNode, oBuffer, index); } timeOut--; } } Loading Loading @@ -642,6 +623,8 @@ void decodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer, frameID++; } int timeOut = TIMEOUT_COUNTER; bool stall = false; while (1) { status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); Loading Loading @@ -672,9 +655,21 @@ void decodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer, (*Info)[frameID].bytesCount, flags, (*Info)[frameID].timestamp); frameID++; } stall = false; } else stall = true; if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { dispatchOutputBuffer(omxNode, oBuffer, index); stall = false; } else stall = true; if (stall) timeOut--; else timeOut = TIMEOUT_COUNTER; if (timeOut == 0) { EXPECT_TRUE(false) << "Wait on Input/Output is found indefinite"; break; } } } Loading Loading @@ -778,7 +773,7 @@ TEST_F(AudioDecHidlTest, DecodeTest) { eleStream.close(); waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding, kPortIndexInput, kPortIndexOutput); testEOS(&iBuffer, &oBuffer); testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag); EXPECT_EQ(timestampUslist.empty(), true); // set state to idle changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); Loading Loading @@ -825,7 +820,7 @@ TEST_F(AudioDecHidlTest, EOSTest_M) { changeStateIdletoExecute(omxNode, observer); // request EOS at the start testEOS(&iBuffer, &oBuffer, true); testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag); flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, kPortIndexOutput); EXPECT_GE(framesReceived, 0U); Loading Loading @@ -908,7 +903,7 @@ TEST_F(AudioDecHidlTest, ThumbnailTest) { eleStream.close(); waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding, kPortIndexInput, kPortIndexOutput); testEOS(&iBuffer, &oBuffer); testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag); flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, kPortIndexOutput); EXPECT_GE(framesReceived, 1U); Loading @@ -924,7 +919,7 @@ TEST_F(AudioDecHidlTest, ThumbnailTest) { eleStream.close(); waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding, kPortIndexInput, kPortIndexOutput); testEOS(&iBuffer, &oBuffer, true); testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag); flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, kPortIndexOutput); EXPECT_GE(framesReceived, 1U); Loading Loading @@ -1004,7 +999,7 @@ TEST_F(AudioDecHidlTest, SimpleEOSTest) { eleStream.close(); waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding, kPortIndexInput, kPortIndexOutput); testEOS(&iBuffer, &oBuffer); testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag); flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, kPortIndexOutput); framesReceived = 0; Loading media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp +98 −12 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ using ::android::hardware::media::omx::V1_0::IOmxObserver; using ::android::hardware::media::omx::V1_0::IOmxNode; using ::android::hardware::media::omx::V1_0::Message; using ::android::hardware::media::omx::V1_0::CodecBuffer; using ::android::hardware::media::omx::V1_0::PortMode; using ::android::hidl::allocator::V1_0::IAllocator; using ::android::hidl::memory::V1_0::IMemory; using ::android::hidl::memory::V1_0::IMapper; Loading Loading @@ -135,7 +136,10 @@ class AudioEncHidlTest : public ::testing::VtsHalHidlTargetTestBase { omx = ::testing::VtsHalHidlTargetTestBase::getService<IOmx>( gEnv->getInstance()); ASSERT_NE(omx, nullptr); observer = new CodecObserver([this](Message msg) { (void)msg; }); observer = new CodecObserver([this](Message msg, const BufferInfo* buffer) { handleMessage(msg, buffer); }); ASSERT_NE(observer, nullptr); if (strncmp(gEnv->getComponent().c_str(), "OMX.", 4) != 0) disableTest = true; Loading Loading @@ -191,6 +195,7 @@ class AudioEncHidlTest : public ::testing::VtsHalHidlTargetTestBase { } } if (i == kNumCompToCoding) disableTest = true; eosFlag = false; if (disableTest) std::cerr << "[ ] Warning ! Test Disabled\n"; } Loading @@ -201,6 +206,36 @@ class AudioEncHidlTest : public ::testing::VtsHalHidlTargetTestBase { } } // callback function to process messages received by onMessages() from IL // client. void handleMessage(Message msg, const BufferInfo* buffer) { (void)buffer; if (msg.type == Message::Type::FILL_BUFFER_DONE) { if (msg.data.extendedBufferData.flags & OMX_BUFFERFLAG_EOS) { eosFlag = true; } if (msg.data.extendedBufferData.rangeLength != 0) { #define WRITE_OUTPUT 0 #if WRITE_OUTPUT static int count = 0; FILE* ofp = nullptr; if (count) ofp = fopen("out.bin", "ab"); else ofp = fopen("out.bin", "wb"); if (ofp != nullptr) { fwrite(static_cast<void*>(buffer->mMemory->getPointer()), sizeof(char), msg.data.extendedBufferData.rangeLength, ofp); fclose(ofp); count++; } #endif } } } enum standardComp { amrnb, amrwb, Loading @@ -215,6 +250,7 @@ class AudioEncHidlTest : public ::testing::VtsHalHidlTargetTestBase { standardComp compName; OMX_AUDIO_CODINGTYPE eEncoding; bool disableTest; bool eosFlag; protected: static void description(const std::string& description) { Loading Loading @@ -289,12 +325,44 @@ void GetURLForComponent(AudioEncHidlTest::standardComp comp, char* mURL) { } } // blocking call to ensures application to Wait till all the inputs are consumed void waitOnInputConsumption(sp<IOmxNode> omxNode, sp<CodecObserver> observer, android::Vector<BufferInfo>* iBuffer, android::Vector<BufferInfo>* oBuffer) { android::hardware::media::omx::V1_0::Status status; Message msg; int timeOut = TIMEOUT_COUNTER; while (timeOut--) { size_t i = 0; status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, 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 // than DEFAULT_TIMEOUT or component needs output buffers to start // processing. for (; i < iBuffer->size(); i++) { if ((*iBuffer)[i].owner != client) break; } if (i == iBuffer->size()) break; // Dispatch an output buffer assuming outQueue.empty() is true size_t index; if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { dispatchOutputBuffer(omxNode, oBuffer, index); } timeOut--; } } // Encode N Frames void encodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer, android::Vector<BufferInfo>* iBuffer, android::Vector<BufferInfo>* oBuffer, uint32_t nFrames, int32_t samplesPerFrame, int32_t nChannels, int32_t nSampleRate, std::ifstream& eleStream) { int32_t nSampleRate, std::ifstream& eleStream, bool signalEOS = true) { android::hardware::media::omx::V1_0::Status status; Message msg; Loading @@ -307,6 +375,7 @@ void encodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer, int32_t timestampIncr = (int)(((float)samplesPerFrame / nSampleRate) * 1000000); uint64_t timestamp = 0; uint32_t flags = 0; for (size_t i = 0; i < iBuffer->size() && nFrames != 0; i++) { char* ipBuffer = static_cast<char*>( static_cast<void*>((*iBuffer)[i].mMemory->getPointer())); Loading @@ -314,11 +383,14 @@ void encodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer, static_cast<int>((*iBuffer)[i].mMemory->getSize())); eleStream.read(ipBuffer, bytesCount); if (eleStream.gcount() != bytesCount) break; dispatchInputBuffer(omxNode, iBuffer, i, bytesCount, 0, timestamp); if (signalEOS && (nFrames == 1)) flags = OMX_BUFFERFLAG_EOS; dispatchInputBuffer(omxNode, iBuffer, i, bytesCount, flags, timestamp); timestamp += timestampIncr; nFrames--; } int timeOut = TIMEOUT_COUNTER; bool stall = false; while (1) { status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); Loading @@ -337,14 +409,27 @@ void encodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer, static_cast<int>((*iBuffer)[index].mMemory->getSize())); eleStream.read(ipBuffer, bytesCount); if (eleStream.gcount() != bytesCount) break; dispatchInputBuffer(omxNode, iBuffer, index, bytesCount, 0, if (signalEOS && (nFrames == 1)) flags = OMX_BUFFERFLAG_EOS; dispatchInputBuffer(omxNode, iBuffer, index, bytesCount, flags, timestamp); timestamp += timestampIncr; nFrames--; } stall = false; } else stall = true; // Dispatch output buffer if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { dispatchOutputBuffer(omxNode, oBuffer, index); stall = false; } else stall = true; if (stall) timeOut--; else timeOut = TIMEOUT_COUNTER; if (timeOut == 0) { EXPECT_TRUE(false) << "Wait on Input/Output is found indefinite"; break; } } } Loading Loading @@ -380,8 +465,8 @@ TEST_F(AudioEncHidlTest, EnumeratePortFormat) { } // test raw stream encode TEST_F(AudioEncHidlTest, EncodeTest) { description("Tests Encode"); TEST_F(AudioEncHidlTest, SimpleEncodeTest) { description("Tests Basic encoding and EOS"); if (disableTest) return; android::hardware::media::omx::V1_0::Status status; uint32_t kPortIndexInput = 0, kPortIndexOutput = 1; Loading @@ -399,8 +484,6 @@ TEST_F(AudioEncHidlTest, EncodeTest) { GetURLForComponent(compName, mURL); std::ifstream eleStream; eleStream.open(mURL, std::ifstream::binary); ASSERT_EQ(eleStream.is_open(), true); // Configure input port int32_t nChannels = 2; Loading Loading @@ -449,16 +532,19 @@ TEST_F(AudioEncHidlTest, EncodeTest) { // set state to executing changeStateIdletoExecute(omxNode, observer); encodeNFrames(omxNode, observer, &iBuffer, &oBuffer, 1024, samplesPerFrame, eleStream.open(mURL, std::ifstream::binary); ASSERT_EQ(eleStream.is_open(), true); encodeNFrames(omxNode, observer, &iBuffer, &oBuffer, 128, samplesPerFrame, nChannels, nSampleRate, eleStream); eleStream.close(); waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer); testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag); // set state to idle changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); // set state to executing changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, kPortIndexOutput); eleStream.close(); } int main(int argc, char** argv) { Loading media/omx/1.0/vts/functional/audio/media_audio_hidl_test_common.cpp +1 −271 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
media/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ subdirs = [ "1.0", "omx/1.0", "omx/1.0/vts/functional/audio", "omx/1.0/vts/functional/common", "omx/1.0/vts/functional/component", "omx/1.0/vts/functional/master", "omx/1.0/vts/functional/video", Loading
media/omx/1.0/vts/functional/audio/Android.bp +4 −2 Original line number Diff line number Diff line Loading @@ -34,7 +34,8 @@ cc_test { "android.hidl.memory@1.0", "android.hardware.media.omx@1.0", ], static_libs: ["VtsHalHidlTargetTestBase"], static_libs: ["VtsHalHidlTargetTestBase", "VtsHalMediaOmxV1_0CommonUtil"], cflags: [ "-O0", "-g", Loading Loading @@ -65,7 +66,8 @@ cc_test { "android.hidl.memory@1.0", "android.hardware.media.omx@1.0", ], static_libs: ["VtsHalHidlTargetTestBase"], static_libs: ["VtsHalHidlTargetTestBase", "VtsHalMediaOmxV1_0CommonUtil"], cflags: [ "-O0", "-g", Loading
media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp +45 −50 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ using ::android::hardware::media::omx::V1_0::IOmxObserver; using ::android::hardware::media::omx::V1_0::IOmxNode; using ::android::hardware::media::omx::V1_0::Message; using ::android::hardware::media::omx::V1_0::CodecBuffer; using ::android::hardware::media::omx::V1_0::PortMode; using ::android::hidl::allocator::V1_0::IAllocator; using ::android::hidl::memory::V1_0::IMemory; using ::android::hidl::memory::V1_0::IMapper; Loading Loading @@ -136,7 +137,9 @@ class AudioDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { gEnv->getInstance()); ASSERT_NE(omx, nullptr); observer = new CodecObserver([this](Message msg) { handleMessage(msg); }); new CodecObserver([this](Message msg, const BufferInfo* buffer) { handleMessage(msg, buffer); }); ASSERT_NE(observer, nullptr); if (strncmp(gEnv->getComponent().c_str(), "OMX.", 4) != 0) disableTest = true; Loading Loading @@ -218,7 +221,8 @@ class AudioDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { // callback function to process messages received by onMessages() from IL // client. void handleMessage(Message msg) { void handleMessage(Message msg, const BufferInfo* buffer) { (void)buffer; if (msg.type == Message::Type::FILL_BUFFER_DONE) { if (msg.data.extendedBufferData.flags & OMX_BUFFERFLAG_EOS) { eosFlag = true; Loading Loading @@ -254,12 +258,25 @@ class AudioDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { } } } #define WRITE_OUTPUT 0 #if WRITE_OUTPUT static int count = 0; FILE* ofp = nullptr; if (count) ofp = fopen("out.bin", "ab"); else ofp = fopen("out.bin", "wb"); if (ofp != nullptr) { fwrite(static_cast<void*>(buffer->mMemory->getPointer()), sizeof(char), msg.data.extendedBufferData.rangeLength, ofp); fclose(ofp); count++; } #endif } } } void testEOS(android::Vector<BufferInfo>* iBuffer, android::Vector<BufferInfo>* oBuffer, bool signalEOS = false); enum standardComp { mp3, Loading Loading @@ -294,44 +311,6 @@ class AudioDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { } }; // end of stream test for audio decoder components void AudioDecHidlTest::testEOS(android::Vector<BufferInfo>* iBuffer, android::Vector<BufferInfo>* oBuffer, bool signalEOS) { android::hardware::media::omx::V1_0::Status status; size_t i = 0; if (signalEOS) { if ((i = getEmptyBufferID(iBuffer)) < iBuffer->size()) { // signal an empty buffer with flag set to EOS dispatchInputBuffer(omxNode, iBuffer, i, 0, OMX_BUFFERFLAG_EOS, 0); } else { ASSERT_TRUE(false); } } // Dispatch all client owned output buffers to recover remaining frames while (1) { if ((i = getEmptyBufferID(oBuffer)) < oBuffer->size()) { dispatchOutputBuffer(omxNode, oBuffer, i); } else { break; } } while (1) { Message msg; status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); EXPECT_EQ(status, android::hardware::media::omx::V1_0::Status::TIMED_OUT); for (; i < iBuffer->size(); i++) { if ((*iBuffer)[i].owner != client) break; } if (i == iBuffer->size()) break; } // test for flag EXPECT_EQ(eosFlag, true); eosFlag = false; } // Set Default port param. void setDefaultPortParam( sp<IOmxNode> omxNode, OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE eEncoding, Loading Loading @@ -580,8 +559,9 @@ void waitOnInputConsumption(sp<IOmxNode> omxNode, sp<CodecObserver> observer, OMX_U32 kPortIndexInput, OMX_U32 kPortIndexOutput) { android::hardware::media::omx::V1_0::Status status; Message msg; int timeOut = TIMEOUT_COUNTER; while (1) { while (timeOut--) { size_t i = 0; status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); Loading @@ -603,6 +583,7 @@ void waitOnInputConsumption(sp<IOmxNode> omxNode, sp<CodecObserver> observer, if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { dispatchOutputBuffer(omxNode, oBuffer, index); } timeOut--; } } Loading Loading @@ -642,6 +623,8 @@ void decodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer, frameID++; } int timeOut = TIMEOUT_COUNTER; bool stall = false; while (1) { status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); Loading Loading @@ -672,9 +655,21 @@ void decodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer, (*Info)[frameID].bytesCount, flags, (*Info)[frameID].timestamp); frameID++; } stall = false; } else stall = true; if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { dispatchOutputBuffer(omxNode, oBuffer, index); stall = false; } else stall = true; if (stall) timeOut--; else timeOut = TIMEOUT_COUNTER; if (timeOut == 0) { EXPECT_TRUE(false) << "Wait on Input/Output is found indefinite"; break; } } } Loading Loading @@ -778,7 +773,7 @@ TEST_F(AudioDecHidlTest, DecodeTest) { eleStream.close(); waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding, kPortIndexInput, kPortIndexOutput); testEOS(&iBuffer, &oBuffer); testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag); EXPECT_EQ(timestampUslist.empty(), true); // set state to idle changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); Loading Loading @@ -825,7 +820,7 @@ TEST_F(AudioDecHidlTest, EOSTest_M) { changeStateIdletoExecute(omxNode, observer); // request EOS at the start testEOS(&iBuffer, &oBuffer, true); testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag); flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, kPortIndexOutput); EXPECT_GE(framesReceived, 0U); Loading Loading @@ -908,7 +903,7 @@ TEST_F(AudioDecHidlTest, ThumbnailTest) { eleStream.close(); waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding, kPortIndexInput, kPortIndexOutput); testEOS(&iBuffer, &oBuffer); testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag); flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, kPortIndexOutput); EXPECT_GE(framesReceived, 1U); Loading @@ -924,7 +919,7 @@ TEST_F(AudioDecHidlTest, ThumbnailTest) { eleStream.close(); waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding, kPortIndexInput, kPortIndexOutput); testEOS(&iBuffer, &oBuffer, true); testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag); flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, kPortIndexOutput); EXPECT_GE(framesReceived, 1U); Loading Loading @@ -1004,7 +999,7 @@ TEST_F(AudioDecHidlTest, SimpleEOSTest) { eleStream.close(); waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding, kPortIndexInput, kPortIndexOutput); testEOS(&iBuffer, &oBuffer); testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag); flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, kPortIndexOutput); framesReceived = 0; Loading
media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp +98 −12 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ using ::android::hardware::media::omx::V1_0::IOmxObserver; using ::android::hardware::media::omx::V1_0::IOmxNode; using ::android::hardware::media::omx::V1_0::Message; using ::android::hardware::media::omx::V1_0::CodecBuffer; using ::android::hardware::media::omx::V1_0::PortMode; using ::android::hidl::allocator::V1_0::IAllocator; using ::android::hidl::memory::V1_0::IMemory; using ::android::hidl::memory::V1_0::IMapper; Loading Loading @@ -135,7 +136,10 @@ class AudioEncHidlTest : public ::testing::VtsHalHidlTargetTestBase { omx = ::testing::VtsHalHidlTargetTestBase::getService<IOmx>( gEnv->getInstance()); ASSERT_NE(omx, nullptr); observer = new CodecObserver([this](Message msg) { (void)msg; }); observer = new CodecObserver([this](Message msg, const BufferInfo* buffer) { handleMessage(msg, buffer); }); ASSERT_NE(observer, nullptr); if (strncmp(gEnv->getComponent().c_str(), "OMX.", 4) != 0) disableTest = true; Loading Loading @@ -191,6 +195,7 @@ class AudioEncHidlTest : public ::testing::VtsHalHidlTargetTestBase { } } if (i == kNumCompToCoding) disableTest = true; eosFlag = false; if (disableTest) std::cerr << "[ ] Warning ! Test Disabled\n"; } Loading @@ -201,6 +206,36 @@ class AudioEncHidlTest : public ::testing::VtsHalHidlTargetTestBase { } } // callback function to process messages received by onMessages() from IL // client. void handleMessage(Message msg, const BufferInfo* buffer) { (void)buffer; if (msg.type == Message::Type::FILL_BUFFER_DONE) { if (msg.data.extendedBufferData.flags & OMX_BUFFERFLAG_EOS) { eosFlag = true; } if (msg.data.extendedBufferData.rangeLength != 0) { #define WRITE_OUTPUT 0 #if WRITE_OUTPUT static int count = 0; FILE* ofp = nullptr; if (count) ofp = fopen("out.bin", "ab"); else ofp = fopen("out.bin", "wb"); if (ofp != nullptr) { fwrite(static_cast<void*>(buffer->mMemory->getPointer()), sizeof(char), msg.data.extendedBufferData.rangeLength, ofp); fclose(ofp); count++; } #endif } } } enum standardComp { amrnb, amrwb, Loading @@ -215,6 +250,7 @@ class AudioEncHidlTest : public ::testing::VtsHalHidlTargetTestBase { standardComp compName; OMX_AUDIO_CODINGTYPE eEncoding; bool disableTest; bool eosFlag; protected: static void description(const std::string& description) { Loading Loading @@ -289,12 +325,44 @@ void GetURLForComponent(AudioEncHidlTest::standardComp comp, char* mURL) { } } // blocking call to ensures application to Wait till all the inputs are consumed void waitOnInputConsumption(sp<IOmxNode> omxNode, sp<CodecObserver> observer, android::Vector<BufferInfo>* iBuffer, android::Vector<BufferInfo>* oBuffer) { android::hardware::media::omx::V1_0::Status status; Message msg; int timeOut = TIMEOUT_COUNTER; while (timeOut--) { size_t i = 0; status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, 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 // than DEFAULT_TIMEOUT or component needs output buffers to start // processing. for (; i < iBuffer->size(); i++) { if ((*iBuffer)[i].owner != client) break; } if (i == iBuffer->size()) break; // Dispatch an output buffer assuming outQueue.empty() is true size_t index; if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { dispatchOutputBuffer(omxNode, oBuffer, index); } timeOut--; } } // Encode N Frames void encodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer, android::Vector<BufferInfo>* iBuffer, android::Vector<BufferInfo>* oBuffer, uint32_t nFrames, int32_t samplesPerFrame, int32_t nChannels, int32_t nSampleRate, std::ifstream& eleStream) { int32_t nSampleRate, std::ifstream& eleStream, bool signalEOS = true) { android::hardware::media::omx::V1_0::Status status; Message msg; Loading @@ -307,6 +375,7 @@ void encodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer, int32_t timestampIncr = (int)(((float)samplesPerFrame / nSampleRate) * 1000000); uint64_t timestamp = 0; uint32_t flags = 0; for (size_t i = 0; i < iBuffer->size() && nFrames != 0; i++) { char* ipBuffer = static_cast<char*>( static_cast<void*>((*iBuffer)[i].mMemory->getPointer())); Loading @@ -314,11 +383,14 @@ void encodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer, static_cast<int>((*iBuffer)[i].mMemory->getSize())); eleStream.read(ipBuffer, bytesCount); if (eleStream.gcount() != bytesCount) break; dispatchInputBuffer(omxNode, iBuffer, i, bytesCount, 0, timestamp); if (signalEOS && (nFrames == 1)) flags = OMX_BUFFERFLAG_EOS; dispatchInputBuffer(omxNode, iBuffer, i, bytesCount, flags, timestamp); timestamp += timestampIncr; nFrames--; } int timeOut = TIMEOUT_COUNTER; bool stall = false; while (1) { status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); Loading @@ -337,14 +409,27 @@ void encodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer, static_cast<int>((*iBuffer)[index].mMemory->getSize())); eleStream.read(ipBuffer, bytesCount); if (eleStream.gcount() != bytesCount) break; dispatchInputBuffer(omxNode, iBuffer, index, bytesCount, 0, if (signalEOS && (nFrames == 1)) flags = OMX_BUFFERFLAG_EOS; dispatchInputBuffer(omxNode, iBuffer, index, bytesCount, flags, timestamp); timestamp += timestampIncr; nFrames--; } stall = false; } else stall = true; // Dispatch output buffer if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { dispatchOutputBuffer(omxNode, oBuffer, index); stall = false; } else stall = true; if (stall) timeOut--; else timeOut = TIMEOUT_COUNTER; if (timeOut == 0) { EXPECT_TRUE(false) << "Wait on Input/Output is found indefinite"; break; } } } Loading Loading @@ -380,8 +465,8 @@ TEST_F(AudioEncHidlTest, EnumeratePortFormat) { } // test raw stream encode TEST_F(AudioEncHidlTest, EncodeTest) { description("Tests Encode"); TEST_F(AudioEncHidlTest, SimpleEncodeTest) { description("Tests Basic encoding and EOS"); if (disableTest) return; android::hardware::media::omx::V1_0::Status status; uint32_t kPortIndexInput = 0, kPortIndexOutput = 1; Loading @@ -399,8 +484,6 @@ TEST_F(AudioEncHidlTest, EncodeTest) { GetURLForComponent(compName, mURL); std::ifstream eleStream; eleStream.open(mURL, std::ifstream::binary); ASSERT_EQ(eleStream.is_open(), true); // Configure input port int32_t nChannels = 2; Loading Loading @@ -449,16 +532,19 @@ TEST_F(AudioEncHidlTest, EncodeTest) { // set state to executing changeStateIdletoExecute(omxNode, observer); encodeNFrames(omxNode, observer, &iBuffer, &oBuffer, 1024, samplesPerFrame, eleStream.open(mURL, std::ifstream::binary); ASSERT_EQ(eleStream.is_open(), true); encodeNFrames(omxNode, observer, &iBuffer, &oBuffer, 128, samplesPerFrame, nChannels, nSampleRate, eleStream); eleStream.close(); waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer); testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag); // set state to idle changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); // set state to executing changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, kPortIndexOutput); eleStream.close(); } int main(int argc, char** argv) { Loading
media/omx/1.0/vts/functional/audio/media_audio_hidl_test_common.cpp +1 −271 File changed.Preview size limit exceeded, changes collapsed. Show changes