diff options
Diffstat (limited to 'media')
56 files changed, 2702 insertions, 1544 deletions
diff --git a/media/1.0/Android.bp b/media/1.0/Android.bp index 61eeb3f9b..de2187edb 100644 --- a/media/1.0/Android.bp +++ b/media/1.0/Android.bp @@ -32,13 +32,16 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.media@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.media@1.0_genc++"], generated_headers: ["android.hardware.media@1.0_genc++_headers"], export_generated_headers: ["android.hardware.media@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", diff --git a/media/omx/1.0/Android.bp b/media/omx/1.0/Android.bp index 8f172f0cc..f8bed6edb 100644 --- a/media/omx/1.0/Android.bp +++ b/media/omx/1.0/Android.bp @@ -74,13 +74,16 @@ genrule { ], } -cc_library_shared { +cc_library { name: "android.hardware.media.omx@1.0", defaults: ["hidl-module-defaults"], generated_sources: ["android.hardware.media.omx@1.0_genc++"], generated_headers: ["android.hardware.media.omx@1.0_genc++_headers"], export_generated_headers: ["android.hardware.media.omx@1.0_genc++_headers"], vendor_available: true, + vndk: { + enabled: true, + }, shared_libs: [ "libhidlbase", "libhidltransport", @@ -91,7 +94,6 @@ cc_library_shared { "android.hardware.graphics.bufferqueue@1.0", "android.hardware.graphics.common@1.0", "android.hardware.media@1.0", - "android.hidl.base@1.0", ], export_shared_lib_headers: [ "libhidlbase", @@ -101,6 +103,5 @@ cc_library_shared { "android.hardware.graphics.bufferqueue@1.0", "android.hardware.graphics.common@1.0", "android.hardware.media@1.0", - "android.hidl.base@1.0", ], } diff --git a/media/omx/1.0/IOmxStore.hal b/media/omx/1.0/IOmxStore.hal index a224b0e16..3ec053578 100644 --- a/media/omx/1.0/IOmxStore.hal +++ b/media/omx/1.0/IOmxStore.hal @@ -39,7 +39,7 @@ interface IOmxStore { * string: arbitrary string * size: <num>x<num> * ratio: <num>:<num> - * range<type>: <type>-<type> + * range<type>: <type> | <type>-<type> * list<type>: <type> | <type>,<list<type>> */ struct Attribute { @@ -97,7 +97,7 @@ interface IOmxStore { * * Required node attributes for video nodes that are required by Android to * describe measured values for this device: - * key: 'measured-frame-rate-<width>-<height>-range', + * key: 'measured-frame-rate-<width>x<height>-range', * value-type: range<num>; where width: num, height: num * * Optional node attributes for decoders to describe supported values: @@ -111,7 +111,7 @@ interface IOmxStore { * Optional node attributes for encoders to describe supported values: * key: 'complexity-default', value-type: num * key: 'complexity-range', value-type: range<num> - * key: 'feature-bitrate-control', value-type: list<enum<VBR,CBR,CQ>> + * key: 'feature-bitrate-modes', value-type: list<enum<VBR,CBR,CQ>> * key: 'feature-intra-refresh', value-type: enum<0,1> * key: 'quality-default', value-type: num * key: 'quality-range', value-type: range<num> diff --git a/media/omx/1.0/vts/functional/audio/Android.bp b/media/omx/1.0/vts/functional/audio/Android.bp index 66fd20be2..f517fa1d9 100644 --- a/media/omx/1.0/vts/functional/audio/Android.bp +++ b/media/omx/1.0/vts/functional/audio/Android.bp @@ -16,65 +16,19 @@ cc_test { name: "VtsHalMediaOmxV1_0TargetAudioEncTest", - defaults: ["hidl_defaults"], - srcs: ["VtsHalMediaOmxV1_0TargetAudioEncTest.cpp", - "media_audio_hidl_test_common.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidlmemory", - "libhidltransport", - "libhwbinder", - "libnativehelper", - "libutils", - "libstagefright_foundation", - "android.hidl.allocator@1.0", - "android.hidl.memory@1.0", - "android.hardware.media.omx@1.0", - ], - static_libs: ["VtsHalHidlTargetTestBase", - "VtsHalMediaOmxV1_0CommonUtil"], - cflags: [ - "-O0", - "-g", - ], - include_dirs: [ - "frameworks/native/include/media/openmax/", - "hardware/interfaces/media/omx/1.0/vts/functional/common", + defaults: ["VtsHalMediaOmxV1_0Defaults"], + srcs: [ + "VtsHalMediaOmxV1_0TargetAudioEncTest.cpp", + "media_audio_hidl_test_common.cpp" ], } cc_test { name: "VtsHalMediaOmxV1_0TargetAudioDecTest", - defaults: ["hidl_defaults"], - srcs: ["VtsHalMediaOmxV1_0TargetAudioDecTest.cpp", - "media_audio_hidl_test_common.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidlmemory", - "libhidltransport", - "libhwbinder", - "libnativehelper", - "libutils", - "libstagefright_foundation", - "android.hidl.allocator@1.0", - "android.hidl.memory@1.0", - "android.hardware.media.omx@1.0", - ], - static_libs: ["VtsHalHidlTargetTestBase", - "VtsHalMediaOmxV1_0CommonUtil"], - cflags: [ - "-O0", - "-g", - ], - include_dirs: [ - "frameworks/native/include/media/openmax/", - "hardware/interfaces/media/omx/1.0/vts/functional/common", + defaults: ["VtsHalMediaOmxV1_0Defaults"], + srcs: [ + "VtsHalMediaOmxV1_0TargetAudioDecTest.cpp", + "media_audio_hidl_test_common.cpp" ], } diff --git a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp index 346605ae2..0b661c94e 100644 --- a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp +++ b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioDecTest.cpp @@ -15,6 +15,10 @@ */ #define LOG_TAG "media_omx_hidl_audio_dec_test" +#ifdef __LP64__ +#define OMX_ANDROID_COMPILE_AS_32BIT_ON_64BIT_PLATFORMS +#endif + #include <android-base/logging.h> #include <android/hardware/media/omx/1.0/IOmx.h> @@ -129,12 +133,22 @@ static ComponentTestEnvironment* gEnv = nullptr; // audio decoder test fixture class class AudioDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { + private: + typedef ::testing::VtsHalHidlTargetTestBase Super; public: + ::std::string getTestCaseInfo() const override { + return ::std::string() + + "Component: " + gEnv->getComponent().c_str() + " | " + + "Role: " + gEnv->getRole().c_str() + " | " + + "Instance: " + gEnv->getInstance().c_str() + " | " + + "Res: " + gEnv->getRes().c_str(); + } + virtual void SetUp() override { + Super::SetUp(); disableTest = false; android::hardware::media::omx::V1_0::Status status; - omx = ::testing::VtsHalHidlTargetTestBase::getService<IOmx>( - gEnv->getInstance()); + omx = Super::getService<IOmx>(gEnv->getInstance()); ASSERT_NE(omx, nullptr); observer = new CodecObserver([this](Message msg, const BufferInfo* buffer) { @@ -151,6 +165,7 @@ class AudioDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { this->omxNode = _nl; }) .isOk()); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); ASSERT_NE(omxNode, nullptr); ASSERT_NE(gEnv->getRole().empty(), true) << "Invalid Component Role"; struct StringToName { @@ -161,7 +176,7 @@ class AudioDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { {"mp3", mp3}, {"amrnb", amrnb}, {"amrwb", amrwb}, {"aac", aac}, {"vorbis", vorbis}, {"opus", opus}, {"pcm", pcm}, {"g711alaw", g711alaw}, {"g711mlaw", g711mlaw}, - {"gsm", gsm}, {"raw", raw}, + {"gsm", gsm}, {"raw", raw}, {"flac", flac}, }; const size_t kNumStringToName = sizeof(kStringToName) / sizeof(kStringToName[0]); @@ -194,6 +209,7 @@ class AudioDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { {g711mlaw, OMX_AUDIO_CodingG711}, {gsm, OMX_AUDIO_CodingGSMFR}, {raw, OMX_AUDIO_CodingPCM}, + {flac, OMX_AUDIO_CodingFLAC}, }; static const size_t kNumCompToCoding = sizeof(kCompToCoding) / sizeof(kCompToCoding[0]); @@ -223,9 +239,14 @@ class AudioDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { virtual void TearDown() override { if (omxNode != nullptr) { + // If you have encountered a fatal failure, it is possible that + // freeNode() will not go through. Instead of hanging the app. + // let it pass through and report errors + if (::testing::Test::HasFatalFailure()) return; EXPECT_TRUE((omxNode->freeNode()).isOk()); omxNode = nullptr; } + Super::TearDown(); } // callback function to process messages received by onMessages() from IL @@ -261,9 +282,8 @@ class AudioDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { EXPECT_EQ(tsHit, true) << "TimeStamp not recognized"; } else { - std::cerr - << "[ ] Warning ! Received non-zero " - "output / TimeStamp not recognized \n"; + std::cout << "[ INFO ] Received non-zero " + "output / TimeStamp not recognized \n"; } } } @@ -299,6 +319,7 @@ class AudioDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { g711mlaw, gsm, raw, + flac, unknown_comp, }; @@ -417,6 +438,9 @@ void getInputChannelInfo(sp<IOmxNode> omxNode, OMX_U32 kPortIndexInput, ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); *nChannels = param.nChannels; + // NOTE: For amrnb sample rate is 8k and amrwb sample rate is 16k. + // There is no nSampleRate field in OMX_AUDIO_PARAM_AMRTYPE. Just + // return 8k to avoid returning uninit variable. *nSampleRate = 8000; break; } @@ -430,6 +454,16 @@ void getInputChannelInfo(sp<IOmxNode> omxNode, OMX_U32 kPortIndexInput, *nSampleRate = param.nSampleRate; break; } + case OMX_AUDIO_CodingFLAC: { + OMX_AUDIO_PARAM_FLACTYPE param; + status = getPortParam(omxNode, OMX_IndexParamAudioFlac, + kPortIndexInput, ¶m); + ASSERT_EQ(status, + ::android::hardware::media::omx::V1_0::Status::OK); + *nChannels = param.nChannels; + *nSampleRate = param.nSampleRate; + break; + } default: ASSERT_TRUE(false); break; @@ -471,6 +505,9 @@ void GetURLForComponent(AudioDecHidlTest::standardComp comp, char* mURL, "bbb_gsm_1ch_8khz_13kbps.info"}, {AudioDecHidlTest::standardComp::raw, "bbb_raw_1ch_8khz_s32le.raw", "bbb_raw_1ch_8khz_s32le.info"}, + {AudioDecHidlTest::standardComp::flac, + "bbb_flac_stereo_680kbps_48000hz.flac", + "bbb_flac_stereo_680kbps_48000hz.info"}, }; for (size_t i = 0; i < sizeof(kCompToURL) / sizeof(kCompToURL[0]); ++i) { @@ -529,13 +566,13 @@ void portReconfiguration(sp<IOmxNode> omxNode, sp<CodecObserver> observer, // set Port Params int32_t nChannels; int32_t nSampleRate; - getInputChannelInfo(omxNode, kPortIndexInput, eEncoding, &nChannels, - &nSampleRate); + ASSERT_NO_FATAL_FAILURE(getInputChannelInfo( + omxNode, kPortIndexInput, eEncoding, &nChannels, &nSampleRate)); // Configure output port // SPECIAL CASE: Soft Vorbis, Opus and Raw Decoders do not offer way - // to - // configure output PCM port. The port undergoes auto configuration - // internally basing on parsed elementary stream information. + // to configure output PCM port. The port undergoes auto + // configuration internally basing on parsed elementary stream + // information. if (comp != AudioDecHidlTest::standardComp::vorbis && comp != AudioDecHidlTest::standardComp::opus && comp != AudioDecHidlTest::standardComp::raw) { @@ -544,9 +581,8 @@ void portReconfiguration(sp<IOmxNode> omxNode, sp<CodecObserver> observer, nSampleRate); } - // If you can disable a port, then you should be able to - // enable - // it as well + // If you can disable a port, then you should be able to enable it + // as well status = omxNode->sendCommand( toRawCommandType(OMX_CommandPortEnable), kPortIndexOutput); ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); @@ -557,7 +593,8 @@ void portReconfiguration(sp<IOmxNode> omxNode, sp<CodecObserver> observer, ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::TIMED_OUT); - allocatePortBuffers(omxNode, oBuffer, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE( + allocatePortBuffers(omxNode, oBuffer, kPortIndexOutput)); status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); @@ -567,14 +604,14 @@ void portReconfiguration(sp<IOmxNode> omxNode, sp<CodecObserver> observer, // dispatch output buffers for (size_t i = 0; i < oBuffer->size(); i++) { - dispatchOutputBuffer(omxNode, oBuffer, i); + ASSERT_NO_FATAL_FAILURE( + dispatchOutputBuffer(omxNode, oBuffer, i)); } } else { ASSERT_TRUE(false); } } else { - EXPECT_TRUE(false); - return; + ASSERT_TRUE(false); } } @@ -587,18 +624,19 @@ 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); + ASSERT_EQ(msg.type, Message::Type::EVENT); packedArgs audioArgs = {eEncoding, comp}; - portReconfiguration(omxNode, observer, iBuffer, oBuffer, - kPortIndexInput, kPortIndexOutput, msg, - PortMode::PRESET_BYTE_BUFFER, &audioArgs); + ASSERT_NO_FATAL_FAILURE( + 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 @@ -611,9 +649,10 @@ void waitOnInputConsumption(sp<IOmxNode> omxNode, sp<CodecObserver> observer, // Dispatch an output buffer assuming outQueue.empty() is true size_t index; if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { - dispatchOutputBuffer(omxNode, oBuffer, index); + ASSERT_NO_FATAL_FAILURE( + dispatchOutputBuffer(omxNode, oBuffer, index)); + timeOut = TIMEOUT_COUNTER_Q; } - timeOut--; } } @@ -627,51 +666,29 @@ void decodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer, AudioDecHidlTest::standardComp comp, bool signalEOS = true) { android::hardware::media::omx::V1_0::Status status; Message msg; - - // dispatch output buffers - for (size_t i = 0; i < oBuffer->size(); i++) { - dispatchOutputBuffer(omxNode, oBuffer, i); - } - // dispatch input buffers + size_t index; uint32_t flags = 0; int frameID = offset; - for (size_t i = 0; (i < iBuffer->size()) && (frameID < (int)Info->size()) && - (frameID < (offset + range)); - i++) { - char* ipBuffer = static_cast<char*>( - static_cast<void*>((*iBuffer)[i].mMemory->getPointer())); - ASSERT_LE((*Info)[frameID].bytesCount, - static_cast<int>((*iBuffer)[i].mMemory->getSize())); - eleStream.read(ipBuffer, (*Info)[frameID].bytesCount); - ASSERT_EQ(eleStream.gcount(), (*Info)[frameID].bytesCount); - flags = (*Info)[frameID].flags; - if (signalEOS && ((frameID == (int)Info->size() - 1) || - (frameID == (offset + range - 1)))) - flags |= OMX_BUFFERFLAG_EOS; - dispatchInputBuffer(omxNode, iBuffer, i, (*Info)[frameID].bytesCount, - flags, (*Info)[frameID].timestamp); - frameID++; - } + int timeOut = TIMEOUT_COUNTER_Q; + bool iQueued, oQueued; - int timeOut = TIMEOUT_COUNTER; - bool stall = false; 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 && msg.type == Message::Type::EVENT) { packedArgs audioArgs = {eEncoding, comp}; - portReconfiguration(omxNode, observer, iBuffer, oBuffer, - kPortIndexInput, kPortIndexOutput, msg, - PortMode::PRESET_BYTE_BUFFER, &audioArgs); + ASSERT_NO_FATAL_FAILURE( + portReconfiguration(omxNode, observer, iBuffer, oBuffer, + kPortIndexInput, kPortIndexOutput, msg, + PortMode::PRESET_BYTE_BUFFER, &audioArgs)); } if (frameID == (int)Info->size() || frameID == (offset + range)) break; // Dispatch input buffer - size_t index = 0; if ((index = getEmptyBufferID(iBuffer)) < iBuffer->size()) { char* ipBuffer = static_cast<char*>( static_cast<void*>((*iBuffer)[index].mMemory->getPointer())); @@ -680,28 +697,33 @@ void decodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer, eleStream.read(ipBuffer, (*Info)[frameID].bytesCount); ASSERT_EQ(eleStream.gcount(), (*Info)[frameID].bytesCount); flags = (*Info)[frameID].flags; + // Indicate to omx core that the buffer contains a full frame worth + // of data + flags |= OMX_BUFFERFLAG_ENDOFFRAME; + // Indicate the omx core that this is the last buffer it needs to + // process if (signalEOS && ((frameID == (int)Info->size() - 1) || (frameID == (offset + range - 1)))) flags |= OMX_BUFFERFLAG_EOS; - dispatchInputBuffer(omxNode, iBuffer, index, - (*Info)[frameID].bytesCount, flags, - (*Info)[frameID].timestamp); + ASSERT_NO_FATAL_FAILURE(dispatchInputBuffer( + omxNode, iBuffer, index, (*Info)[frameID].bytesCount, flags, + (*Info)[frameID].timestamp)); frameID++; - 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--; + ASSERT_NO_FATAL_FAILURE( + dispatchOutputBuffer(omxNode, oBuffer, index)); + oQueued = true; + } + // Reset Counters when either input or output buffer is dispatched + 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; + ASSERT_TRUE(false) << "Wait on Input/Output is found indefinite"; } } } @@ -716,7 +738,7 @@ TEST_F(AudioDecHidlTest, SetRole) { } // port format enumeration -TEST_F(AudioDecHidlTest, DISABLED_EnumeratePortFormat) { +TEST_F(AudioDecHidlTest, EnumeratePortFormat) { description("Test Component on Mandatory Port Parameters (Port Format)"); if (disableTest) return; android::hardware::media::omx::V1_0::Status status; @@ -783,8 +805,8 @@ TEST_F(AudioDecHidlTest, DecodeTest) { setDefaultPortParam(omxNode, kPortIndexInput, eEncoding, 1, 8000, OMX_AUDIO_PCMModeLinear, OMX_NumericalDataSigned, 32); - getInputChannelInfo(omxNode, kPortIndexInput, eEncoding, &nChannels, - &nSampleRate); + ASSERT_NO_FATAL_FAILURE(getInputChannelInfo( + omxNode, kPortIndexInput, eEncoding, &nChannels, &nSampleRate)); // Configure output port // SPECIAL CASE: Soft Vorbis, Opus and Raw Decoders do not offer way to // configure output PCM port. The port undergoes auto configuration @@ -797,36 +819,37 @@ TEST_F(AudioDecHidlTest, DecodeTest) { android::Vector<BufferInfo> iBuffer, oBuffer; // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); // Port Reconfiguration eleStream.open(mURL, std::ifstream::binary); ASSERT_EQ(eleStream.is_open(), true); - decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, eEncoding, - kPortIndexInput, kPortIndexOutput, eleStream, &Info, 0, - (int)Info.size(), compName); + ASSERT_NO_FATAL_FAILURE(decodeNFrames( + omxNode, observer, &iBuffer, &oBuffer, eEncoding, kPortIndexInput, + kPortIndexOutput, eleStream, &Info, 0, (int)Info.size(), compName)); eleStream.close(); - waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding, - kPortIndexInput, kPortIndexOutput, compName); + ASSERT_NO_FATAL_FAILURE( + waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding, + kPortIndexInput, kPortIndexOutput, compName)); packedArgs audioArgs = {eEncoding, compName}; - testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, nullptr, - portReconfiguration, kPortIndexInput, kPortIndexOutput, &audioArgs); + ASSERT_NO_FATAL_FAILURE(testEOS( + omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, nullptr, + portReconfiguration, kPortIndexInput, kPortIndexOutput, &audioArgs)); if (timestampDevTest) EXPECT_EQ(timestampUslist.empty(), true); // set state to idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); // set state to executing - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); } // end of sequence test -// SPECIAL CASE; Sending Empty input EOS buffer is not supported across all -// components. For instance soft vorbis and soft opus expects CSD buffers at -// the start. Disabling this test for now. We shall revisit this at a later -// stage -TEST_F(AudioDecHidlTest, DISABLED_EOSTest_M) { +TEST_F(AudioDecHidlTest, EOSTest_M) { description("Test end of stream monkeying"); if (disableTest) return; android::hardware::media::omx::V1_0::Status status; @@ -848,8 +871,8 @@ TEST_F(AudioDecHidlTest, DISABLED_EOSTest_M) { setDefaultPortParam(omxNode, kPortIndexInput, eEncoding, 1, 8000, OMX_AUDIO_PCMModeLinear, OMX_NumericalDataSigned, 32); - getInputChannelInfo(omxNode, kPortIndexInput, eEncoding, &nChannels, - &nSampleRate); + ASSERT_NO_FATAL_FAILURE(getInputChannelInfo( + omxNode, kPortIndexInput, eEncoding, &nChannels, &nSampleRate)); // Configure output port // SPECIAL CASE: Soft Vorbis, Opus and Raw Decoders do not offer way to // configure output PCM port. The port undergoes auto configuration @@ -862,26 +885,31 @@ TEST_F(AudioDecHidlTest, DISABLED_EOSTest_M) { android::Vector<BufferInfo> iBuffer, oBuffer; // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); // request EOS at the start packedArgs audioArgs = {eEncoding, compName}; - testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, nullptr, - portReconfiguration, kPortIndexInput, kPortIndexOutput, &audioArgs); - flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(testEOS( + omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, nullptr, + portReconfiguration, kPortIndexInput, kPortIndexOutput, &audioArgs)); + ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput)); EXPECT_GE(framesReceived, 0U); framesReceived = 0; timestampUs = 0; // set state to idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); + // set state to executing - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); } // end of sequence test @@ -927,8 +955,8 @@ TEST_F(AudioDecHidlTest, ThumbnailTest) { setDefaultPortParam(omxNode, kPortIndexInput, eEncoding, 1, 8000, OMX_AUDIO_PCMModeLinear, OMX_NumericalDataSigned, 32); - getInputChannelInfo(omxNode, kPortIndexInput, eEncoding, &nChannels, - &nSampleRate); + ASSERT_NO_FATAL_FAILURE(getInputChannelInfo( + omxNode, kPortIndexInput, eEncoding, &nChannels, &nSampleRate)); // Configure output port // SPECIAL CASE: Soft Vorbis, Opus and Raw Decoders do not offer way to // configure output PCM port. The port undergoes auto configuration @@ -941,10 +969,11 @@ TEST_F(AudioDecHidlTest, ThumbnailTest) { android::Vector<BufferInfo> iBuffer, oBuffer; // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); // request EOS for thumbnail // signal EOS flag with last frame @@ -952,17 +981,19 @@ TEST_F(AudioDecHidlTest, ThumbnailTest) { while (!(Info[i].flags & OMX_BUFFERFLAG_SYNCFRAME)) i++; eleStream.open(mURL, std::ifstream::binary); ASSERT_EQ(eleStream.is_open(), true); - decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, eEncoding, - kPortIndexInput, kPortIndexOutput, eleStream, &Info, 0, i + 1, - compName); + ASSERT_NO_FATAL_FAILURE(decodeNFrames( + omxNode, observer, &iBuffer, &oBuffer, eEncoding, kPortIndexInput, + kPortIndexOutput, eleStream, &Info, 0, i + 1, compName)); eleStream.close(); - waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding, - kPortIndexInput, kPortIndexOutput, compName); + ASSERT_NO_FATAL_FAILURE( + waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding, + 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); + ASSERT_NO_FATAL_FAILURE(testEOS( + omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, nullptr, + portReconfiguration, kPortIndexInput, kPortIndexOutput, &audioArgs)); + ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput)); EXPECT_GE(framesReceived, 1U); framesReceived = 0; timestampUs = 0; @@ -970,25 +1001,29 @@ TEST_F(AudioDecHidlTest, ThumbnailTest) { // signal EOS flag after last frame eleStream.open(mURL, std::ifstream::binary); ASSERT_EQ(eleStream.is_open(), true); - decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, eEncoding, - kPortIndexInput, kPortIndexOutput, eleStream, &Info, 0, i + 1, - compName, false); + ASSERT_NO_FATAL_FAILURE(decodeNFrames( + omxNode, observer, &iBuffer, &oBuffer, eEncoding, kPortIndexInput, + kPortIndexOutput, eleStream, &Info, 0, i + 1, compName, false)); eleStream.close(); - waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding, - kPortIndexInput, kPortIndexOutput, compName); - testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, nullptr, - portReconfiguration, kPortIndexInput, kPortIndexOutput, &audioArgs); - flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE( + waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding, + kPortIndexInput, kPortIndexOutput, compName)); + ASSERT_NO_FATAL_FAILURE(testEOS( + omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, nullptr, + portReconfiguration, kPortIndexInput, kPortIndexOutput, &audioArgs)); + ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput)); EXPECT_GE(framesReceived, 1U); framesReceived = 0; timestampUs = 0; // set state to idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); // set state to executing - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); } // end of sequence test @@ -1034,8 +1069,8 @@ TEST_F(AudioDecHidlTest, SimpleEOSTest) { setDefaultPortParam(omxNode, kPortIndexInput, eEncoding, 1, 8000, OMX_AUDIO_PCMModeLinear, OMX_NumericalDataSigned, 32); - getInputChannelInfo(omxNode, kPortIndexInput, eEncoding, &nChannels, - &nSampleRate); + ASSERT_NO_FATAL_FAILURE(getInputChannelInfo( + omxNode, kPortIndexInput, eEncoding, &nChannels, &nSampleRate)); // Configure output port // SPECIAL CASE: Soft Vorbis, Opus and Raw Decoders do not offer way to // configure output PCM port. The port undergoes auto configuration @@ -1048,33 +1083,39 @@ TEST_F(AudioDecHidlTest, SimpleEOSTest) { android::Vector<BufferInfo> iBuffer, oBuffer; // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); // request EOS at the end eleStream.open(mURL, std::ifstream::binary); ASSERT_EQ(eleStream.is_open(), true); - decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, eEncoding, - kPortIndexInput, kPortIndexOutput, eleStream, &Info, 0, - (int)Info.size(), compName, false); + ASSERT_NO_FATAL_FAILURE(decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, + eEncoding, kPortIndexInput, + kPortIndexOutput, eleStream, &Info, 0, + (int)Info.size(), compName, false)); eleStream.close(); - waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding, - kPortIndexInput, kPortIndexOutput, compName); + ASSERT_NO_FATAL_FAILURE( + waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, eEncoding, + 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); + ASSERT_NO_FATAL_FAILURE(testEOS( + omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, nullptr, + portReconfiguration, kPortIndexInput, kPortIndexOutput, &audioArgs)); + ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput)); framesReceived = 0; timestampUs = 0; // set state to idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); // set state to executing - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); } // test input/output port flush @@ -1120,8 +1161,8 @@ TEST_F(AudioDecHidlTest, FlushTest) { setDefaultPortParam(omxNode, kPortIndexInput, eEncoding, 1, 8000, OMX_AUDIO_PCMModeLinear, OMX_NumericalDataSigned, 32); - getInputChannelInfo(omxNode, kPortIndexInput, eEncoding, &nChannels, - &nSampleRate); + ASSERT_NO_FATAL_FAILURE(getInputChannelInfo( + omxNode, kPortIndexInput, eEncoding, &nChannels, &nSampleRate)); // Configure output port // SPECIAL CASE: Soft Vorbis, Opus and Raw Decoders do not offer way to // configure output PCM port. The port undergoes auto configuration @@ -1134,10 +1175,11 @@ TEST_F(AudioDecHidlTest, FlushTest) { android::Vector<BufferInfo> iBuffer, oBuffer; // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); // Decode 128 frames and flush. here 128 is chosen to ensure there is a key // frame after this so that the below section can be convered for all @@ -1145,12 +1187,11 @@ TEST_F(AudioDecHidlTest, FlushTest) { int nFrames = 128; eleStream.open(mURL, std::ifstream::binary); ASSERT_EQ(eleStream.is_open(), true); - 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); + ASSERT_NO_FATAL_FAILURE(decodeNFrames( + omxNode, observer, &iBuffer, &oBuffer, eEncoding, kPortIndexInput, + kPortIndexOutput, eleStream, &Info, 0, nFrames, compName, false)); + ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput)); framesReceived = 0; // Seek to next key frame and start decoding till the end @@ -1167,20 +1208,22 @@ TEST_F(AudioDecHidlTest, FlushTest) { index++; } if (keyFrame) { - decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, eEncoding, - kPortIndexInput, kPortIndexOutput, eleStream, &Info, - index, Info.size() - index, compName, false); + ASSERT_NO_FATAL_FAILURE( + decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, eEncoding, + 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); + ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput)); framesReceived = 0; // set state to idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); // set state to executing - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); } int main(int argc, char** argv) { diff --git a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp index 7a5dceca8..953dc7507 100644 --- a/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp +++ b/media/omx/1.0/vts/functional/audio/VtsHalMediaOmxV1_0TargetAudioEncTest.cpp @@ -15,6 +15,10 @@ */ #define LOG_TAG "media_omx_hidl_audio_enc_test" +#ifdef __LP64__ +#define OMX_ANDROID_COMPILE_AS_32BIT_ON_64BIT_PLATFORMS +#endif + #include <android-base/logging.h> #include <android/hardware/media/omx/1.0/IOmx.h> @@ -129,12 +133,22 @@ static ComponentTestEnvironment* gEnv = nullptr; // audio encoder test fixture class class AudioEncHidlTest : public ::testing::VtsHalHidlTargetTestBase { + private: + typedef ::testing::VtsHalHidlTargetTestBase Super; public: + ::std::string getTestCaseInfo() const override { + return ::std::string() + + "Component: " + gEnv->getComponent().c_str() + " | " + + "Role: " + gEnv->getRole().c_str() + " | " + + "Instance: " + gEnv->getInstance().c_str() + " | " + + "Res: " + gEnv->getRes().c_str(); + } + virtual void SetUp() override { + Super::SetUp(); disableTest = false; android::hardware::media::omx::V1_0::Status status; - omx = ::testing::VtsHalHidlTargetTestBase::getService<IOmx>( - gEnv->getInstance()); + omx = Super::getService<IOmx>(gEnv->getInstance()); ASSERT_NE(omx, nullptr); observer = new CodecObserver([this](Message msg, const BufferInfo* buffer) { @@ -151,6 +165,7 @@ class AudioEncHidlTest : public ::testing::VtsHalHidlTargetTestBase { this->omxNode = _nl; }) .isOk()); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); ASSERT_NE(omxNode, nullptr); ASSERT_NE(gEnv->getRole().empty(), true) << "Invalid Component Role"; struct StringToName { @@ -196,14 +211,19 @@ class AudioEncHidlTest : public ::testing::VtsHalHidlTargetTestBase { } if (i == kNumCompToCoding) disableTest = true; eosFlag = false; - if (disableTest) std::cerr << "[ ] Warning ! Test Disabled\n"; + if (disableTest) std::cout << "[ WARN ] Test Disabled \n"; } virtual void TearDown() override { if (omxNode != nullptr) { + // If you have encountered a fatal failure, it is possible that + // freeNode() will not go through. Instead of hanging the app. + // let it pass through and report errors + if (::testing::Test::HasFatalFailure()) return; EXPECT_TRUE((omxNode->freeNode()).isOk()); omxNode = nullptr; } + Super::TearDown(); } // callback function to process messages received by onMessages() from IL @@ -331,13 +351,13 @@ 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); - EXPECT_EQ(status, + observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_Q, iBuffer, oBuffer); + ASSERT_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 @@ -350,9 +370,10 @@ void waitOnInputConsumption(sp<IOmxNode> omxNode, sp<CodecObserver> observer, // Dispatch an output buffer assuming outQueue.empty() is true size_t index; if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { - dispatchOutputBuffer(omxNode, oBuffer, index); + ASSERT_NO_FATAL_FAILURE( + dispatchOutputBuffer(omxNode, oBuffer, index)); + timeOut = TIMEOUT_COUNTER_Q; } - timeOut--; } } @@ -365,43 +386,25 @@ void encodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer, bool signalEOS = true) { android::hardware::media::omx::V1_0::Status status; Message msg; - - // dispatch output buffers - for (size_t i = 0; i < oBuffer->size(); i++) { - dispatchOutputBuffer(omxNode, oBuffer, i); - } - // dispatch input buffers + size_t index; int bytesCount = samplesPerFrame * nChannels * 2; 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())); - ASSERT_LE(bytesCount, - static_cast<int>((*iBuffer)[i].mMemory->getSize())); - eleStream.read(ipBuffer, bytesCount); - if (eleStream.gcount() != bytesCount) break; - if (signalEOS && (nFrames == 1)) flags = OMX_BUFFERFLAG_EOS; - dispatchInputBuffer(omxNode, iBuffer, i, bytesCount, flags, timestamp); - timestamp += timestampIncr; - nFrames--; - } + int timeOut = TIMEOUT_COUNTER_Q; + bool iQueued, oQueued; - int timeOut = TIMEOUT_COUNTER; - bool stall = false; 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); if (nFrames == 0) break; // Dispatch input buffer - size_t index = 0; if ((index = getEmptyBufferID(iBuffer)) < iBuffer->size()) { char* ipBuffer = static_cast<char*>( static_cast<void*>((*iBuffer)[index].mMemory->getPointer())); @@ -409,27 +412,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; - if (signalEOS && (nFrames == 1)) flags = OMX_BUFFERFLAG_EOS; - dispatchInputBuffer(omxNode, iBuffer, index, bytesCount, flags, - timestamp); + flags = OMX_BUFFERFLAG_ENDOFFRAME; + if (signalEOS && (nFrames == 1)) flags |= OMX_BUFFERFLAG_EOS; + ASSERT_NO_FATAL_FAILURE(dispatchInputBuffer( + omxNode, iBuffer, index, bytesCount, flags, 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--; + ASSERT_NO_FATAL_FAILURE( + dispatchOutputBuffer(omxNode, oBuffer, index)); + oQueued = true; + } + // Reset Counters when either input or output buffer is dispatched + 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; + ASSERT_TRUE(false) << "Wait on Input/Output is found indefinite"; } } } @@ -444,7 +447,7 @@ TEST_F(AudioEncHidlTest, SetRole) { } // port format enumeration -TEST_F(AudioEncHidlTest, DISABLED_EnumeratePortFormat) { +TEST_F(AudioEncHidlTest, EnumeratePortFormat) { description("Test Component on Mandatory Port Parameters (Port Format)"); if (disableTest) return; android::hardware::media::omx::V1_0::Status status; @@ -520,31 +523,39 @@ TEST_F(AudioEncHidlTest, SimpleEncodeTest) { } setupPCMPort(omxNode, kPortIndexInput, nChannels, OMX_NumericalDataSigned, 16, nSampleRate, OMX_AUDIO_PCMModeLinear); + // Configure output port - setDefaultPortParam(omxNode, kPortIndexOutput, eEncoding, compName, - nChannels, nSampleRate, nBitRate); + ASSERT_NO_FATAL_FAILURE(setDefaultPortParam(omxNode, kPortIndexOutput, + eEncoding, compName, nChannels, + nSampleRate, nBitRate)); android::Vector<BufferInfo> iBuffer, oBuffer; // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); eleStream.open(mURL, std::ifstream::binary); ASSERT_EQ(eleStream.is_open(), true); - encodeNFrames(omxNode, observer, &iBuffer, &oBuffer, 128, samplesPerFrame, - nChannels, nSampleRate, eleStream); + ASSERT_NO_FATAL_FAILURE(encodeNFrames(omxNode, observer, &iBuffer, &oBuffer, + 128, samplesPerFrame, nChannels, + nSampleRate, eleStream)); eleStream.close(); - waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer); - testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag); + ASSERT_NO_FATAL_FAILURE( + waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer)); + ASSERT_NO_FATAL_FAILURE( + testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag)); // set state to idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); // set state to executing - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); } int main(int argc, char** argv) { diff --git a/media/omx/1.0/vts/functional/audio/media_audio_hidl_test_common.cpp b/media/omx/1.0/vts/functional/audio/media_audio_hidl_test_common.cpp index 99671d411..e7ae08301 100644 --- a/media/omx/1.0/vts/functional/audio/media_audio_hidl_test_common.cpp +++ b/media/omx/1.0/vts/functional/audio/media_audio_hidl_test_common.cpp @@ -15,6 +15,10 @@ */ #define LOG_TAG "media_omx_hidl_audio_test_common" +#ifdef __LP64__ +#define OMX_ANDROID_COMPILE_AS_32BIT_ON_64BIT_PLATFORMS +#endif + #include <android-base/logging.h> #include <android/hardware/media/omx/1.0/IOmx.h> diff --git a/media/omx/1.0/vts/functional/audio/media_audio_hidl_test_common.h b/media/omx/1.0/vts/functional/audio/media_audio_hidl_test_common.h index 08b3d9cd5..b187d2841 100644 --- a/media/omx/1.0/vts/functional/audio/media_audio_hidl_test_common.h +++ b/media/omx/1.0/vts/functional/audio/media_audio_hidl_test_common.h @@ -20,11 +20,6 @@ #include <media_hidl_test_common.h> /* - * Random Index used for monkey testing while get/set parameters - */ -#define RANDOM_INDEX 1729 - -/* * Common audio utils */ void enumerateProfile(sp<IOmxNode> omxNode, OMX_U32 portIndex, diff --git a/media/omx/1.0/vts/functional/common/Android.bp b/media/omx/1.0/vts/functional/common/Android.bp index 93251fe89..cdc52fb47 100644 --- a/media/omx/1.0/vts/functional/common/Android.bp +++ b/media/omx/1.0/vts/functional/common/Android.bp @@ -16,18 +16,43 @@ cc_library_static { name: "VtsHalMediaOmxV1_0CommonUtil", - defaults: ["hidl_defaults"], srcs: ["media_hidl_test_common.cpp"], - shared_libs: [ - "liblog", + + header_libs: ["media_plugin_headers"], + export_header_lib_headers: ["media_plugin_headers"], + export_include_dirs: ["."], + + static_libs: [ + "VtsHalHidlTargetTestBase", "libhidlmemory", "android.hidl.allocator@1.0", "android.hidl.memory@1.0", "android.hardware.media.omx@1.0", + "android.hardware.graphics.allocator@2.0", ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ "-O0", "-g", ], - include_dirs: [ - "frameworks/native/include/media/openmax/", +} + +cc_defaults { + name: "VtsHalMediaOmxV1_0Defaults", + defaults: ["VtsHalTargetTestDefaults"], + + // Link to these statically as they are not guaranteed to be on the device. + static_libs: [ + "VtsHalMediaOmxV1_0CommonUtil", + "android.hardware.graphics.allocator@2.0", + "android.hardware.graphics.mapper@2.0", + "android.hardware.graphics.bufferqueue@1.0", + "android.hardware.graphics.common@1.0", + "android.hardware.media.omx@1.0", + "android.hardware.media@1.0", + "android.hidl.allocator@1.0", + "android.hidl.memory@1.0", + "libhidlmemory", + "libnativehelper", + ], + + // TODO(b/64437680): Assume these libs are always available on the device. + shared_libs: [ + "libstagefright_foundation", ], } diff --git a/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp b/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp index 1f67e2b6a..34a96a0ce 100644 --- a/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp +++ b/media/omx/1.0/vts/functional/common/media_hidl_test_common.cpp @@ -15,13 +15,15 @@ */ #define LOG_TAG "media_omx_hidl_video_test_common" - #ifdef __LP64__ #define OMX_ANDROID_COMPILE_AS_32BIT_ON_64BIT_PLATFORMS #endif #include <android-base/logging.h> +#include <android/hardware/graphics/allocator/2.0/IAllocator.h> +#include <android/hardware/graphics/mapper/2.0/IMapper.h> +#include <android/hardware/graphics/mapper/2.0/types.h> #include <android/hardware/media/omx/1.0/IOmx.h> #include <android/hardware/media/omx/1.0/IOmxNode.h> #include <android/hardware/media/omx/1.0/IOmxObserver.h> @@ -29,7 +31,10 @@ #include <android/hidl/allocator/1.0/IAllocator.h> #include <android/hidl/memory/1.0/IMapper.h> #include <android/hidl/memory/1.0/IMemory.h> +#include <cutils/atomic.h> +using ::android::hardware::graphics::common::V1_0::BufferUsage; +using ::android::hardware::graphics::common::V1_0::PixelFormat; using ::android::hardware::media::omx::V1_0::IOmx; using ::android::hardware::media::omx::V1_0::IOmxObserver; using ::android::hardware::media::omx::V1_0::IOmxNode; @@ -186,10 +191,157 @@ Return<android::hardware::media::omx::V1_0::Status> setAudioPortFormat( return status; } +void allocateGraphicBuffers(sp<IOmxNode> omxNode, OMX_U32 portIndex, + BufferInfo* buffer, uint32_t nFrameWidth, + uint32_t nFrameHeight, int32_t* nStride, + int format) { + android::hardware::media::omx::V1_0::Status status; + sp<android::hardware::graphics::allocator::V2_0::IAllocator> allocator = + android::hardware::graphics::allocator::V2_0::IAllocator::getService(); + ASSERT_NE(nullptr, allocator.get()); + + sp<android::hardware::graphics::mapper::V2_0::IMapper> mapper = + android::hardware::graphics::mapper::V2_0::IMapper::getService(); + ASSERT_NE(mapper.get(), nullptr); + + android::hardware::graphics::mapper::V2_0::IMapper::BufferDescriptorInfo + descriptorInfo; + uint32_t usage; + + descriptorInfo.width = nFrameWidth; + descriptorInfo.height = nFrameHeight; + descriptorInfo.layerCount = 1; + descriptorInfo.format = static_cast<PixelFormat>(format); + descriptorInfo.usage = static_cast<uint64_t>(BufferUsage::CPU_READ_OFTEN); + omxNode->getGraphicBufferUsage( + portIndex, + [&status, &usage](android::hardware::media::omx::V1_0::Status _s, + uint32_t _n1) { + status = _s; + usage = _n1; + }); + if (status == android::hardware::media::omx::V1_0::Status::OK) { + descriptorInfo.usage |= usage; + } + + ::android::hardware::hidl_vec<uint32_t> descriptor; + android::hardware::graphics::mapper::V2_0::Error error; + mapper->createDescriptor( + descriptorInfo, [&error, &descriptor]( + android::hardware::graphics::mapper::V2_0::Error _s, + ::android::hardware::hidl_vec<uint32_t> _n1) { + error = _s; + descriptor = _n1; + }); + ASSERT_EQ(error, android::hardware::graphics::mapper::V2_0::Error::NONE); + + static volatile int32_t nextId = 0; + uint64_t id = static_cast<uint64_t>(getpid()) << 32; + allocator->allocate( + descriptor, 1, + [&](android::hardware::graphics::mapper::V2_0::Error _s, uint32_t _n1, + const ::android::hardware::hidl_vec< + ::android::hardware::hidl_handle>& _n2) { + ASSERT_EQ(android::hardware::graphics::mapper::V2_0::Error::NONE, + _s); + *nStride = _n1; + buffer->omxBuffer.nativeHandle = _n2[0]; + buffer->omxBuffer.attr.anwBuffer.width = nFrameWidth; + buffer->omxBuffer.attr.anwBuffer.height = nFrameHeight; + buffer->omxBuffer.attr.anwBuffer.stride = _n1; + buffer->omxBuffer.attr.anwBuffer.format = descriptorInfo.format; + buffer->omxBuffer.attr.anwBuffer.usage = descriptorInfo.usage; + buffer->omxBuffer.attr.anwBuffer.layerCount = + descriptorInfo.layerCount; + buffer->omxBuffer.attr.anwBuffer.id = + id | static_cast<uint32_t>(android_atomic_inc(&nextId)); + }); +} + +// allocate buffers needed on a component port +void allocateBuffer(sp<IOmxNode> omxNode, BufferInfo* buffer, OMX_U32 portIndex, + OMX_U32 nBufferSize, PortMode portMode) { + android::hardware::media::omx::V1_0::Status status; + + if (portMode == PortMode::PRESET_SECURE_BUFFER) { + buffer->owner = client; + buffer->omxBuffer.type = CodecBuffer::Type::NATIVE_HANDLE; + omxNode->allocateSecureBuffer( + portIndex, nBufferSize, + [&status, &buffer]( + android::hardware::media::omx::V1_0::Status _s, uint32_t id, + ::android::hardware::hidl_handle const& nativeHandle) { + status = _s; + buffer->id = id; + buffer->omxBuffer.nativeHandle = nativeHandle; + }); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + } else if (portMode == PortMode::PRESET_BYTE_BUFFER || + portMode == PortMode::DYNAMIC_ANW_BUFFER) { + sp<IAllocator> allocator = IAllocator::getService("ashmem"); + ASSERT_NE(allocator.get(), nullptr); + + buffer->owner = client; + buffer->omxBuffer.type = CodecBuffer::Type::SHARED_MEM; + buffer->omxBuffer.attr.preset.rangeOffset = 0; + buffer->omxBuffer.attr.preset.rangeLength = 0; + bool success = false; + if (portMode != PortMode::PRESET_BYTE_BUFFER) { + nBufferSize = sizeof(android::VideoNativeMetadata); + } + allocator->allocate( + nBufferSize, + [&success, &buffer](bool _s, + ::android::hardware::hidl_memory const& mem) { + success = _s; + buffer->omxBuffer.sharedMemory = mem; + }); + ASSERT_EQ(success, true); + ASSERT_EQ(buffer->omxBuffer.sharedMemory.size(), nBufferSize); + buffer->mMemory = mapMemory(buffer->omxBuffer.sharedMemory); + ASSERT_NE(buffer->mMemory, nullptr); + if (portMode == PortMode::DYNAMIC_ANW_BUFFER) { + android::VideoNativeMetadata* metaData = + static_cast<android::VideoNativeMetadata*>( + static_cast<void*>(buffer->mMemory->getPointer())); + metaData->nFenceFd = -1; + buffer->slot = -1; + } + omxNode->useBuffer( + portIndex, buffer->omxBuffer, + [&status, &buffer](android::hardware::media::omx::V1_0::Status _s, + uint32_t id) { + status = _s; + buffer->id = id; + }); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + } else if (portMode == PortMode::PRESET_ANW_BUFFER) { + OMX_PARAM_PORTDEFINITIONTYPE portDef; + status = getPortParam(omxNode, OMX_IndexParamPortDefinition, portIndex, + &portDef); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + int32_t nStride; + buffer->owner = client; + buffer->omxBuffer.type = CodecBuffer::Type::ANW_BUFFER; + ASSERT_NO_FATAL_FAILURE(allocateGraphicBuffers( + omxNode, portIndex, buffer, portDef.format.video.nFrameWidth, + portDef.format.video.nFrameHeight, &nStride, + portDef.format.video.eColorFormat)); + omxNode->useBuffer( + portIndex, buffer->omxBuffer, + [&status, &buffer](android::hardware::media::omx::V1_0::Status _s, + uint32_t id) { + status = _s; + buffer->id = id; + }); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + } +} + // allocate buffers needed on a component port void allocatePortBuffers(sp<IOmxNode> omxNode, android::Vector<BufferInfo>* buffArray, - OMX_U32 portIndex, PortMode portMode) { + OMX_U32 portIndex, PortMode portMode, bool allocGrap) { android::hardware::media::omx::V1_0::Status status; OMX_PARAM_PORTDEFINITIONTYPE portDef; @@ -199,70 +351,18 @@ void allocatePortBuffers(sp<IOmxNode> omxNode, &portDef); ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); - if (portMode == PortMode::PRESET_SECURE_BUFFER) { - for (size_t i = 0; i < portDef.nBufferCountActual; i++) { - BufferInfo buffer; - buffer.owner = client; - buffer.omxBuffer.type = CodecBuffer::Type::NATIVE_HANDLE; - omxNode->allocateSecureBuffer( - portIndex, portDef.nBufferSize, - [&status, &buffer]( - android::hardware::media::omx::V1_0::Status _s, uint32_t id, - ::android::hardware::hidl_handle const& nativeHandle) { - status = _s; - buffer.id = id; - buffer.omxBuffer.nativeHandle = nativeHandle; - }); - buffArray->push(buffer); - ASSERT_EQ(status, - ::android::hardware::media::omx::V1_0::Status::OK); - } - } else if (portMode == PortMode::PRESET_BYTE_BUFFER || - portMode == PortMode::DYNAMIC_ANW_BUFFER) { - sp<IAllocator> allocator = IAllocator::getService("ashmem"); - EXPECT_NE(allocator.get(), nullptr); - - for (size_t i = 0; i < portDef.nBufferCountActual; i++) { - BufferInfo buffer; - buffer.owner = client; - buffer.omxBuffer.type = CodecBuffer::Type::SHARED_MEM; - buffer.omxBuffer.attr.preset.rangeOffset = 0; - buffer.omxBuffer.attr.preset.rangeLength = 0; - bool success = false; - if (portMode != PortMode::PRESET_BYTE_BUFFER) { - portDef.nBufferSize = sizeof(android::VideoNativeMetadata); - } - allocator->allocate( - portDef.nBufferSize, - [&success, &buffer]( - bool _s, ::android::hardware::hidl_memory const& mem) { - success = _s; - buffer.omxBuffer.sharedMemory = mem; - }); - ASSERT_EQ(success, true); - ASSERT_EQ(buffer.omxBuffer.sharedMemory.size(), - portDef.nBufferSize); - buffer.mMemory = mapMemory(buffer.omxBuffer.sharedMemory); - ASSERT_NE(buffer.mMemory, nullptr); - if (portMode == PortMode::DYNAMIC_ANW_BUFFER) { - android::VideoNativeMetadata* metaData = - static_cast<android::VideoNativeMetadata*>( - static_cast<void*>(buffer.mMemory->getPointer())); - metaData->nFenceFd = -1; - buffer.slot = -1; - } - omxNode->useBuffer( - portIndex, buffer.omxBuffer, - [&status, &buffer]( - android::hardware::media::omx::V1_0::Status _s, - uint32_t id) { - status = _s; - buffer.id = id; - }); - buffArray->push(buffer); - ASSERT_EQ(status, - ::android::hardware::media::omx::V1_0::Status::OK); + for (size_t i = 0; i < portDef.nBufferCountActual; i++) { + BufferInfo buffer; + ASSERT_NO_FATAL_FAILURE(allocateBuffer(omxNode, &buffer, portIndex, + portDef.nBufferSize, portMode)); + if (allocGrap && portMode == PortMode::DYNAMIC_ANW_BUFFER) { + int32_t nStride; + ASSERT_NO_FATAL_FAILURE(allocateGraphicBuffers( + omxNode, portIndex, &buffer, portDef.format.video.nFrameWidth, + portDef.format.video.nFrameHeight, &nStride, + portDef.format.video.eColorFormat)); } + buffArray->push(buffer); } } @@ -273,7 +373,7 @@ void changeStateLoadedtoIdle(sp<IOmxNode> omxNode, sp<CodecObserver> observer, android::Vector<BufferInfo>* iBuffer, android::Vector<BufferInfo>* oBuffer, OMX_U32 kPortIndexInput, OMX_U32 kPortIndexOutput, - PortMode* portMode) { + PortMode* portMode, bool allocGrap) { android::hardware::media::omx::V1_0::Status status; Message msg; PortMode defaultPortMode[2], *pm; @@ -292,14 +392,16 @@ void changeStateLoadedtoIdle(sp<IOmxNode> omxNode, sp<CodecObserver> observer, ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::TIMED_OUT); // allocate buffers on input port - allocatePortBuffers(omxNode, iBuffer, kPortIndexInput, pm[0]); + ASSERT_NO_FATAL_FAILURE(allocatePortBuffers( + omxNode, iBuffer, kPortIndexInput, pm[0], allocGrap)); // Dont switch states until the ports are populated status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::TIMED_OUT); // allocate buffers on output port - allocatePortBuffers(omxNode, oBuffer, kPortIndexOutput, pm[1]); + ASSERT_NO_FATAL_FAILURE(allocatePortBuffers( + omxNode, oBuffer, kPortIndexOutput, pm[1], allocGrap)); // As the ports are populated, check if the state transition is complete status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); @@ -439,6 +541,7 @@ void dispatchOutputBuffer(sp<IOmxNode> omxNode, status = omxNode->fillBuffer((*buffArray)[bufferIndex].id, t, fenceNh); break; + case PortMode::PRESET_ANW_BUFFER: case PortMode::PRESET_SECURE_BUFFER: case PortMode::PRESET_BYTE_BUFFER: t.sharedMemory = android::hardware::hidl_memory(); @@ -545,43 +648,45 @@ void testEOS(sp<IOmxNode> omxNode, sp<CodecObserver> observer, 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); + ASSERT_NO_FATAL_FAILURE(dispatchInputBuffer(omxNode, iBuffer, i, 0, + OMX_BUFFERFLAG_EOS, 0)); } else { ASSERT_TRUE(false); } } - int timeOut = TIMEOUT_COUNTER; + int timeOut = TIMEOUT_COUNTER_PE; while (timeOut--) { // Dispatch all client owned output buffers to recover remaining frames while (1) { if ((i = getEmptyBufferID(oBuffer)) < oBuffer->size()) { - dispatchOutputBuffer(omxNode, oBuffer, i, pm[1]); + ASSERT_NO_FATAL_FAILURE( + dispatchOutputBuffer(omxNode, oBuffer, i, pm[1])); // 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) { - (*fptr)(omxNode, observer, iBuffer, oBuffer, - kPortIndexInput, kPortIndexOutput, msg, pm[1], - args); + ASSERT_NO_FATAL_FAILURE((*fptr)( + omxNode, observer, iBuffer, oBuffer, kPortIndexInput, + kPortIndexOutput, msg, pm[1], args)); } else { // something unexpected happened - EXPECT_TRUE(false); + ASSERT_TRUE(false); } } else { // something unexpected happened - EXPECT_TRUE(false); + ASSERT_TRUE(false); } } if (eosFlag == true) break; diff --git a/media/omx/1.0/vts/functional/common/media_hidl_test_common.h b/media/omx/1.0/vts/functional/common/media_hidl_test_common.h index 0adea14e8..bec733dc9 100644 --- a/media/omx/1.0/vts/functional/common/media_hidl_test_common.h +++ b/media/omx/1.0/vts/functional/common/media_hidl_test_common.h @@ -1,5 +1,5 @@ /* - * Copyright 2016, The Android Open Source Project + * Copyright 2017, The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -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 @@ -120,13 +133,15 @@ struct CodecObserver : public IOmxObserver { if (it->type == android::hardware::media::omx::V1_0::Message::Type::EVENT) { *msg = *it; - msgQueue.erase(it); + if (callBack) callBack(*it, nullptr); + 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; + if (msg->data.eventData.event == OMX_EventBufferFlag) + continue; return ::android::hardware::media::omx::V1_0::Status::OK; } else if (it->type == android::hardware::media::omx::V1_0:: Message::Type::FILL_BUFFER_DONE) { @@ -137,7 +152,7 @@ struct CodecObserver : public IOmxObserver { it->data.bufferData.buffer) { if (callBack) callBack(*it, &(*oBuffers)[i]); oBuffers->editItemAt(i).owner = client; - msgQueue.erase(it); + it = msgQueue.erase(it); break; } } @@ -152,24 +167,22 @@ struct CodecObserver : public IOmxObserver { it->data.bufferData.buffer) { if (callBack) callBack(*it, &(*iBuffers)[i]); iBuffers->editItemAt(i).owner = client; - msgQueue.erase(it); + it = msgQueue.erase(it); break; } } EXPECT_LE(i, iBuffers->size()); } + } else { + EXPECT_TRUE(false) << "Received unexpected message"; + ++it; } - ++it; } - if (finishBy - android::ALooper::GetNowUs() < 0) - return toStatus(android::TIMED_OUT); - android::status_t err = - (timeoutUs < 0) - ? msgCondition.wait(msgLock) - : msgCondition.waitRelative( - msgLock, - (finishBy - android::ALooper::GetNowUs()) * 1000ll); - if (err == android::TIMED_OUT) return toStatus(err); + int64_t delayUs = finishBy - android::ALooper::GetNowUs(); + if (delayUs < 0) return toStatus(android::TIMED_OUT); + (timeoutUs < 0) + ? msgCondition.wait(msgLock) + : msgCondition.waitRelative(msgLock, delayUs * 1000ll); } } @@ -284,16 +297,21 @@ Return<android::hardware::media::omx::V1_0::Status> setVideoPortFormat( Return<android::hardware::media::omx::V1_0::Status> setAudioPortFormat( sp<IOmxNode> omxNode, OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE eEncoding); +void allocateBuffer(sp<IOmxNode> omxNode, BufferInfo* buffer, OMX_U32 portIndex, + OMX_U32 nBufferSize, PortMode portMode); + void allocatePortBuffers(sp<IOmxNode> omxNode, android::Vector<BufferInfo>* buffArray, OMX_U32 portIndex, - PortMode portMode = PortMode::PRESET_BYTE_BUFFER); + PortMode portMode = PortMode::PRESET_BYTE_BUFFER, + bool allocGrap = false); void changeStateLoadedtoIdle(sp<IOmxNode> omxNode, sp<CodecObserver> observer, android::Vector<BufferInfo>* iBuffer, android::Vector<BufferInfo>* oBuffer, OMX_U32 kPortIndexInput, OMX_U32 kPortIndexOutput, - PortMode* portMode = nullptr); + PortMode* portMode = nullptr, + bool allocGrap = false); void changeStateIdletoLoaded(sp<IOmxNode> omxNode, sp<CodecObserver> observer, android::Vector<BufferInfo>* iBuffer, @@ -322,7 +340,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, diff --git a/media/omx/1.0/vts/functional/component/Android.bp b/media/omx/1.0/vts/functional/component/Android.bp index fd3210fb9..f76b6e94f 100644 --- a/media/omx/1.0/vts/functional/component/Android.bp +++ b/media/omx/1.0/vts/functional/component/Android.bp @@ -16,32 +16,7 @@ cc_test { name: "VtsHalMediaOmxV1_0TargetComponentTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalMediaOmxV1_0Defaults"], srcs: ["VtsHalMediaOmxV1_0TargetComponentTest.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidlmemory", - "libhidltransport", - "libhwbinder", - "libnativehelper", - "libutils", - "libstagefright_foundation", - "android.hidl.allocator@1.0", - "android.hidl.memory@1.0", - "android.hardware.media.omx@1.0", - ], - static_libs: ["VtsHalHidlTargetTestBase", - "VtsHalMediaOmxV1_0CommonUtil"], - cflags: [ - "-O0", - "-g", - ], - include_dirs: [ - "frameworks/native/include/media/openmax/", - "hardware/interfaces/media/omx/1.0/vts/functional/common", - ], } diff --git a/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp b/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp index 38860edc6..d66136d21 100644 --- a/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp +++ b/media/omx/1.0/vts/functional/component/VtsHalMediaOmxV1_0TargetComponentTest.cpp @@ -15,6 +15,10 @@ */ #define LOG_TAG "media_omx_hidl_component_test" +#ifdef __LP64__ +#define OMX_ANDROID_COMPILE_AS_32BIT_ON_64BIT_PLATFORMS +#endif + #include <android-base/logging.h> #include <android/hardware/media/omx/1.0/IOmx.h> @@ -117,12 +121,21 @@ static ComponentTestEnvironment* gEnv = nullptr; // generic component test fixture class class ComponentHidlTest : public ::testing::VtsHalHidlTargetTestBase { + private: + typedef ::testing::VtsHalHidlTargetTestBase Super; public: + ::std::string getTestCaseInfo() const override { + return ::std::string() + + "Component: " + gEnv->getComponent().c_str() + " | " + + "Role: " + gEnv->getRole().c_str() + " | " + + "Instance: " + gEnv->getInstance().c_str(); + } + virtual void SetUp() override { + Super::SetUp(); disableTest = false; android::hardware::media::omx::V1_0::Status status; - omx = ::testing::VtsHalHidlTargetTestBase::getService<IOmx>( - gEnv->getInstance()); + omx = Super::getService<IOmx>(gEnv->getInstance()); ASSERT_NE(omx, nullptr); observer = new CodecObserver(nullptr); ASSERT_NE(observer, nullptr); @@ -136,6 +149,7 @@ class ComponentHidlTest : public ::testing::VtsHalHidlTargetTestBase { this->omxNode = _nl; }) .isOk()); + ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); ASSERT_NE(omxNode, nullptr); ASSERT_NE(gEnv->getRole().empty(), true) << "Invalid Component Role"; struct StringToClass { @@ -172,14 +186,19 @@ class ComponentHidlTest : public ::testing::VtsHalHidlTargetTestBase { strlen(gEnv->getComponent().c_str()) - suffixLen, ".secure"); } - if (disableTest) std::cerr << "[ ] Warning ! Test Disabled\n"; + if (disableTest) std::cout << "[ WARN ] Test Disabled \n"; } virtual void TearDown() override { if (omxNode != nullptr) { + // If you have encountered a fatal failure, it is possible that + // freeNode() will not go through. Instead of hanging the app. + // let it pass through and report errors + if (::testing::Test::HasFatalFailure()) return; EXPECT_TRUE((omxNode->freeNode()).isOk()); omxNode = nullptr; } + Super::TearDown(); } enum standardCompClass { @@ -203,9 +222,6 @@ class ComponentHidlTest : public ::testing::VtsHalHidlTargetTestBase { } }; -// Random Index used for monkey testing while get/set parameters -#define RANDOM_INDEX 1729 - void initPortMode(PortMode* pm, bool isSecure, ComponentHidlTest::standardCompClass compClass) { pm[0] = PortMode::PRESET_BYTE_BUFFER; @@ -222,7 +238,6 @@ void initPortMode(PortMode* pm, bool isSecure, break; } } - return; } // test dispatch message API call @@ -283,7 +298,7 @@ TEST_F(ComponentHidlTest, DISABLED_GetPortIndices) { } // port format enumeration -TEST_F(ComponentHidlTest, DISABLED_EnumeratePortFormat) { +TEST_F(ComponentHidlTest, EnumeratePortFormat) { description("Test Component on Mandatory Port Parameters (Port Format)"); if (disableTest) return; android::hardware::media::omx::V1_0::Status status; @@ -364,7 +379,7 @@ TEST_F(ComponentHidlTest, DISABLED_SetDefaultPortParams) { kPortIndexOutput = kPortIndexInput + 1; } - for (size_t i = kPortIndexInput; i < kPortIndexOutput; i++) { + for (size_t i = kPortIndexInput; i <= kPortIndexOutput; i++) { OMX_PARAM_PORTDEFINITIONTYPE portDef; status = getPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef); @@ -390,28 +405,31 @@ TEST_F(ComponentHidlTest, DISABLED_SetDefaultPortParams) { EXPECT_NE(status, ::android::hardware::media::omx::V1_0::Status::OK); - // Edit Read-Only fields. + // Port Direction - Read Only portDef = mirror; portDef.eDir = static_cast<OMX_DIRTYPE>(RANDOM_INDEX); setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef); getPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef); + if (portDef.eDir != mirror.eDir) { + std::cerr << "[ ERROR ] port direction has to be read only " + "but is changeable \n"; + } EXPECT_EQ(portDef.eDir, mirror.eDir); setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &mirror); - portDef = mirror; - portDef.nBufferSize >>= 1; - setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef); - getPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef); - EXPECT_EQ(portDef.nBufferSize, mirror.nBufferSize); - setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &mirror); - + // Port Min BufferCount - Read Only portDef = mirror; portDef.nBufferCountMin += 1; setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef); getPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef); + if (portDef.nBufferCountMin != mirror.nBufferCountMin) { + std::cerr << "[ ERROR ] port Min BufferCount has to be " + "read only but is changeable \n"; + } EXPECT_EQ(portDef.nBufferCountMin, mirror.nBufferCountMin); setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &mirror); + // Port Actual BufferCount portDef = mirror; portDef.nBufferCountActual += 1; status = setPortParam(omxNode, OMX_IndexParamPortDefinition, i, @@ -422,20 +440,49 @@ TEST_F(ComponentHidlTest, DISABLED_SetDefaultPortParams) { EXPECT_EQ(portDef.nBufferCountActual, mirror.nBufferCountActual + 1); } + setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &mirror); + // Port BufferSize is although read only as per OMX-IL 1.2, android + // doesnt abide by this. + // Decrease buffer size portDef = mirror; - portDef.nBufferSize = mirror.nBufferSize << 1; - status = setPortParam(omxNode, OMX_IndexParamPortDefinition, i, - &portDef); - if (status == ::android::hardware::media::omx::V1_0::Status::OK) { - status = getPortParam(omxNode, OMX_IndexParamPortDefinition, i, - &portDef); - if (portDef.nBufferSize != mirror.nBufferSize) { - std::cout - << "[ ] Warning ! Component input port does " - "not preserve Read-Only fields \n"; + OMX_U32 nBufferSize = portDef.nBufferSize >> 1; + if (nBufferSize != 0) { + if (!strncmp(gEnv->getComponent().c_str(), "OMX.google.", 11)) { + portDef.nBufferSize = nBufferSize; + } else { + // Probable alignment requirements of vendor component + portDef.nBufferSize = ALIGN_POWER_OF_TWO(nBufferSize, 12); + nBufferSize = portDef.nBufferSize; } + } else { + ASSERT_TRUE(false) << "Unexpected buffer size"; } + setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef); + getPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef); + // SPECIAL CASE: For video decoder, allow configuration of input + // buffer size even if it is less than minimum requirement and + // similarly for encoder allow configuration of output port buffer + // size. + if ((compClass == video_encoder && i == kPortIndexOutput) || + (compClass == video_decoder && i == kPortIndexInput)) { + double dev = (portDef.nBufferSize / (double)nBufferSize); + dev -= 1; + if (dev < 0 || dev > 0.1) { + std::cerr << "[ ERROR ] port buffer size deviation " + "larger than expected \n"; + } + } else { + EXPECT_EQ(portDef.nBufferSize, mirror.nBufferSize); + } + setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &mirror); + + // Increase buffer size + portDef = mirror; + portDef.nBufferSize = mirror.nBufferSize << 1; + setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef); + getPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef); + EXPECT_EQ(portDef.nBufferSize, (mirror.nBufferSize << 1)); } } } @@ -460,8 +507,10 @@ TEST_F(ComponentHidlTest, DISABLED_PopulatePort) { portBase = params.nStartPortNumber; } - sp<IAllocator> allocator = IAllocator::getService("ashmem"); - EXPECT_NE(allocator.get(), nullptr); + // set state to idle + status = omxNode->sendCommand(toRawCommandType(OMX_CommandStateSet), + OMX_StateIdle); + ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); OMX_PARAM_PORTDEFINITIONTYPE portDef; status = @@ -475,30 +524,10 @@ TEST_F(ComponentHidlTest, DISABLED_PopulatePort) { for (size_t i = 0; i < portDef.nBufferCountActual; i++) { BufferInfo buffer; - buffer.owner = client; - buffer.omxBuffer.type = CodecBuffer::Type::SHARED_MEM; - buffer.omxBuffer.attr.preset.rangeOffset = 0; - buffer.omxBuffer.attr.preset.rangeLength = 0; - bool success = false; - allocator->allocate( - nBufferSize, - [&success, &buffer](bool _s, - ::android::hardware::hidl_memory const& mem) { - success = _s; - buffer.omxBuffer.sharedMemory = mem; - }); - ASSERT_EQ(success, true); - ASSERT_EQ(buffer.omxBuffer.sharedMemory.size(), nBufferSize); - - omxNode->useBuffer( - portBase, buffer.omxBuffer, - [&status, &buffer](android::hardware::media::omx::V1_0::Status _s, - uint32_t id) { - status = _s; - buffer.id = id; - }); + ASSERT_NO_FATAL_FAILURE(allocateBuffer(omxNode, &buffer, portBase, + nBufferSize, + PortMode::PRESET_BYTE_BUFFER)); pBuffer.push(buffer); - ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); } status = @@ -538,44 +567,160 @@ TEST_F(ComponentHidlTest, Flush) { PortMode portMode[2]; initPortMode(portMode, isSecure, compClass); status = omxNode->setPortMode(kPortIndexInput, portMode[0]); - EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); - EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode); + ASSERT_NO_FATAL_FAILURE( + changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput, portMode)); // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); // dispatch buffers for (size_t i = 0; i < oBuffer.size(); i++) { - dispatchOutputBuffer(omxNode, &oBuffer, i, portMode[1]); + ASSERT_NO_FATAL_FAILURE( + dispatchOutputBuffer(omxNode, &oBuffer, i, portMode[1])); } // flush port - flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput)); +#if 0 // TODO: Sending empty input buffers is slightly tricky. // Components sometimes process input buffers even when output buffers are // not dispatched. For instance Parsing sequence header does not require // output buffers. In such instances sending 0 size input buffers might // make component to send error events. so lets skip this aspect of testing. // dispatch buffers - // for (size_t i = 0; i < iBuffer.size(); i++) { - // dispatchInputBuffer(omxNode, &iBuffer, i, 0, 0, 0, portMode[0]); - // } - // // flush ports - // flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - // kPortIndexOutput); + for (size_t i = 0; i < iBuffer.size(); i++) { + ASSERT_NO_FATAL_FAILURE( + dispatchInputBuffer(omxNode, &iBuffer, i, 0, 0, 0, portMode[0])); + } + // flush ports + ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput)); +#endif + // set state to idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); // set state to loaded - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); } -// state transitions test -TEST_F(ComponentHidlTest, StateTransitions) { - description("Test State Transitions Loaded<->Idle<->Execute"); +// Flush test - monkeying +TEST_F(ComponentHidlTest, Flush_M) { + description("Test Flush monkeying"); + if (disableTest) return; + android::hardware::media::omx::V1_0::Status status; + uint32_t kPortIndexInput = 0, kPortIndexOutput = 1; + Message msg; + + status = setRole(omxNode, gEnv->getRole().c_str()); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + OMX_PORT_PARAM_TYPE params; + if (compClass == audio_decoder || compClass == audio_encoder) { + status = getParam(omxNode, OMX_IndexParamAudioInit, ¶ms); + } else { + status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms); + } + if (status == ::android::hardware::media::omx::V1_0::Status::OK) { + ASSERT_EQ(params.nPorts, 2U); + kPortIndexInput = params.nStartPortNumber; + kPortIndexOutput = kPortIndexInput + 1; + } + + android::Vector<BufferInfo> iBuffer, oBuffer; + + // set port mode + PortMode portMode[2]; + initPortMode(portMode, isSecure, compClass); + status = omxNode->setPortMode(kPortIndexInput, portMode[0]); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + + // // Flush all ports ; receive error OMX_ErrorIncorrectStateOperation + // status = omxNode->sendCommand(toRawCommandType(OMX_CommandFlush), + // OMX_ALL); + // ASSERT_NE(status, android::hardware::media::omx::V1_0::Status::OK); + + // set state to idle + ASSERT_NO_FATAL_FAILURE( + changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput, portMode)); + + // // Flush all ports ; receive error OMX_ErrorIncorrectStateOperation + // status = omxNode->sendCommand(toRawCommandType(OMX_CommandFlush), + // OMX_ALL); + // ASSERT_NE(status, android::hardware::media::omx::V1_0::Status::OK); + + // set state to executing + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); + + // dispatch buffers + for (size_t i = 0; i < oBuffer.size(); i++) { + ASSERT_NO_FATAL_FAILURE( + dispatchOutputBuffer(omxNode, &oBuffer, i, portMode[1])); + } + + // // flush invalid port, expecting OMX_ErrorBadPortIndex + // status = omxNode->sendCommand(toRawCommandType(OMX_CommandFlush), + // RANDOM_INDEX); + // ASSERT_NE(status, android::hardware::media::omx::V1_0::Status::OK); + + // Flush all ports + status = omxNode->sendCommand(toRawCommandType(OMX_CommandFlush), OMX_ALL); + ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); + + for (int j = 0; j < 2; j++) { + status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_PE, &iBuffer, + &oBuffer); + ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); + ASSERT_EQ(msg.type, Message::Type::EVENT); + ASSERT_EQ(msg.data.eventData.event, OMX_EventCmdComplete); + ASSERT_EQ(msg.data.eventData.data1, OMX_CommandFlush); + if (msg.data.eventData.data2 == kPortIndexInput) { + // test if client got all its buffers back + for (size_t i = 0; i < iBuffer.size(); ++i) { + EXPECT_EQ(iBuffer[i].owner, client); + } + } else if (msg.data.eventData.data2 == kPortIndexOutput) { + // test if client got all its buffers back + for (size_t i = 0; i < oBuffer.size(); ++i) { + EXPECT_EQ(oBuffer[i].owner, client); + } + } else { + EXPECT_TRUE(false) << "Bad port Index"; + } + } + + // SPECIAL CASE: When OMX_ALL is used as argument, Android OMX Core sends + // an additional flush event with argument OMX_ALL. This we believe is + // not recognized by OMX-IL Spec. So read this event and ignore it + status = + observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_PE, &iBuffer, &oBuffer); + if (status == android::hardware::media::omx::V1_0::Status::OK) { + ASSERT_EQ(msg.type, Message::Type::EVENT); + ASSERT_EQ(msg.data.eventData.event, OMX_EventCmdComplete); + ASSERT_EQ(msg.data.eventData.data1, OMX_CommandFlush); + ASSERT_EQ(msg.data.eventData.data2, OMX_ALL); + } + + // set state to idle + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); + // set state to loaded + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); +} + +// test port mode configuration when the component is in various states +TEST_F(ComponentHidlTest, PortModeConfig) { + description("Test Port Mode Configuration"); if (disableTest) return; android::hardware::media::omx::V1_0::Status status; uint32_t kPortIndexInput = 0, kPortIndexOutput = 1; @@ -601,33 +746,159 @@ TEST_F(ComponentHidlTest, StateTransitions) { PortMode portMode[2]; initPortMode(portMode, isSecure, compClass); status = omxNode->setPortMode(kPortIndexInput, portMode[0]); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + + // set state to idle + ASSERT_NO_FATAL_FAILURE( + changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput, portMode)); + // Only Allow Port Mode configuration in loaded state + status = omxNode->setPortMode(kPortIndexInput, portMode[0]); + EXPECT_NE(status, ::android::hardware::media::omx::V1_0::Status::OK); + status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); + EXPECT_NE(status, ::android::hardware::media::omx::V1_0::Status::OK); + + // set state to executing + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); + // Only Allow Port Mode configuration in loaded state + status = omxNode->setPortMode(kPortIndexInput, portMode[0]); + EXPECT_NE(status, ::android::hardware::media::omx::V1_0::Status::OK); + status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); + EXPECT_NE(status, ::android::hardware::media::omx::V1_0::Status::OK); + + // set state to idle + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); + // set state to loaded + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); + + status = omxNode->setPortMode(kPortIndexInput, portMode[0]); EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); +} + +// state transitions test +TEST_F(ComponentHidlTest, StateTransitions) { + description("Test State Transitions Loaded<->Idle<->Execute"); + if (disableTest) return; + android::hardware::media::omx::V1_0::Status status; + uint32_t kPortIndexInput = 0, kPortIndexOutput = 1; + OMX_U32 portBase = 0; + Message msg; + status = setRole(omxNode, gEnv->getRole().c_str()); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + OMX_PORT_PARAM_TYPE params; + if (compClass == audio_decoder || compClass == audio_encoder) { + status = getParam(omxNode, OMX_IndexParamAudioInit, ¶ms); + } else { + status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms); + } + if (status == ::android::hardware::media::omx::V1_0::Status::OK) { + ASSERT_EQ(params.nPorts, 2U); + portBase = params.nStartPortNumber; + } + kPortIndexInput = portBase; + kPortIndexOutput = portBase + 1; + + android::Vector<BufferInfo> pBuffer[2]; + + // set port mode + PortMode portMode[2]; + initPortMode(portMode, isSecure, compClass); + status = omxNode->setPortMode(kPortIndexInput, portMode[0]); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + + // set state to idle + status = omxNode->sendCommand(toRawCommandType(OMX_CommandStateSet), + OMX_StateIdle); + ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); + for (size_t j = portBase; j < portBase + 2; j++) { + pBuffer[j - portBase].clear(); + + OMX_PARAM_PORTDEFINITIONTYPE def; + status = getPortParam(omxNode, OMX_IndexParamPortDefinition, j, &def); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + + for (size_t i = 0; i < def.nBufferCountActual; i++) { + // Dont switch states until the ports are populated + status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, + &pBuffer[0], &pBuffer[1]); + ASSERT_EQ(status, + android::hardware::media::omx::V1_0::Status::TIMED_OUT); + + BufferInfo buffer; + ASSERT_NO_FATAL_FAILURE(allocateBuffer( + omxNode, &buffer, j, def.nBufferSize, portMode[j - portBase])); + pBuffer[j - portBase].push(buffer); + } + } + + // As the ports are populated, check if the state transition is complete + status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, &pBuffer[0], + &pBuffer[1]); + ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); + ASSERT_EQ(msg.type, Message::Type::EVENT); + ASSERT_EQ(msg.data.eventData.event, OMX_EventCmdComplete); + ASSERT_EQ(msg.data.eventData.data1, OMX_CommandStateSet); + ASSERT_EQ(msg.data.eventData.data2, OMX_StateIdle); + + // set state to executing + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); + // dispatch buffers + for (size_t i = 0; i < pBuffer[1].size(); i++) { + ASSERT_NO_FATAL_FAILURE( + dispatchOutputBuffer(omxNode, &pBuffer[1], i, portMode[1])); + } // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &pBuffer[0], &pBuffer[1])); +#if 0 // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); + // TODO: Sending empty input buffers is slightly tricky. // dispatch buffers - for (size_t i = 0; i < oBuffer.size(); i++) { - dispatchOutputBuffer(omxNode, &oBuffer, i, portMode[1]); + for (size_t i = 0; i < pBuffer[0].size(); i++) { + ASSERT_NO_FATAL_FAILURE( + dispatchInputBuffer(omxNode, &pBuffer[0], i, 0, 0, 0, portMode[0])); } // set state to idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); - // // set state to executing - // changeStateIdletoExecute(omxNode, observer); - // // TODO: Sending empty input buffers is slightly tricky. - // // dispatch buffers - // for (size_t i = 0; i < iBuffer.size(); i++) { - // dispatchInputBuffer(omxNode, &iBuffer, i, 0, 0, 0, portMode[0]); - // } - // // set state to idle - // changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &pBuffer[0], &pBuffer[1])); +#endif + // set state to loaded - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + status = omxNode->sendCommand(toRawCommandType(OMX_CommandStateSet), + OMX_StateLoaded); + ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); + + for (size_t j = portBase; j < portBase + 2; j++) { + for (size_t i = 0; i < pBuffer[j].size(); ++i) { + // Dont switch states until the ports are populated + status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, + &pBuffer[0], &pBuffer[1]); + ASSERT_EQ(status, + android::hardware::media::omx::V1_0::Status::TIMED_OUT); + + status = omxNode->freeBuffer(j, pBuffer[j][i].id); + ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); + } + } + + status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, &pBuffer[0], + &pBuffer[1]); + ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); + ASSERT_EQ(msg.type, Message::Type::EVENT); + ASSERT_EQ(msg.data.eventData.event, OMX_EventCmdComplete); + ASSERT_EQ(msg.data.eventData.data1, OMX_CommandStateSet); + ASSERT_EQ(msg.data.eventData.data2, OMX_StateLoaded); } // state transitions test - monkeying @@ -665,8 +936,9 @@ TEST_F(ComponentHidlTest, DISABLED_StateTransitions_M) { EXPECT_NE(status, android::hardware::media::omx::V1_0::Status::OK); // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); // set state to idle ; receive error OMX_ErrorSameState status = omxNode->sendCommand(toRawCommandType(OMX_CommandStateSet), @@ -674,7 +946,7 @@ TEST_F(ComponentHidlTest, DISABLED_StateTransitions_M) { EXPECT_NE(status, android::hardware::media::omx::V1_0::Status::OK); // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); // set state to executing ; receive error OMX_ErrorSameState status = omxNode->sendCommand(toRawCommandType(OMX_CommandStateSet), @@ -686,12 +958,13 @@ TEST_F(ComponentHidlTest, DISABLED_StateTransitions_M) { OMX_StateLoaded); EXPECT_NE(status, android::hardware::media::omx::V1_0::Status::OK); - // set state to Idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); - - // set state to Loaded - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + // set state to idle + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); + // set state to loaded + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); } // port enable disable test @@ -774,14 +1047,14 @@ TEST_F(ComponentHidlTest, PortEnableDisable_Idle) { PortMode portMode[2]; initPortMode(portMode, isSecure, compClass); status = omxNode->setPortMode(kPortIndexInput, portMode[0]); - EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); - EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &pBuffer[0], &pBuffer[1], - kPortIndexInput, kPortIndexOutput, portMode); - + ASSERT_NO_FATAL_FAILURE( + changeStateLoadedtoIdle(omxNode, observer, &pBuffer[0], &pBuffer[1], + kPortIndexInput, kPortIndexOutput, portMode)); for (size_t i = portBase; i < portBase + 2; i++) { status = omxNode->sendCommand(toRawCommandType(OMX_CommandPortDisable), i); @@ -829,8 +1102,8 @@ TEST_F(ComponentHidlTest, PortEnableDisable_Idle) { ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::TIMED_OUT); - allocatePortBuffers(omxNode, &pBuffer[i - portBase], i, - portMode[i - portBase]); + ASSERT_NO_FATAL_FAILURE(allocatePortBuffers( + omxNode, &pBuffer[i - portBase], i, portMode[i - portBase])); status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, &pBuffer[0], &pBuffer[1]); ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); @@ -844,8 +1117,9 @@ TEST_F(ComponentHidlTest, PortEnableDisable_Idle) { } // set state to Loaded - changeStateIdletoLoaded(omxNode, observer, &pBuffer[0], &pBuffer[1], - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE( + changeStateIdletoLoaded(omxNode, observer, &pBuffer[0], &pBuffer[1], + kPortIndexInput, kPortIndexOutput)); } // port enable disable test @@ -878,20 +1152,20 @@ TEST_F(ComponentHidlTest, PortEnableDisable_Execute) { PortMode portMode[2]; initPortMode(portMode, isSecure, compClass); status = omxNode->setPortMode(kPortIndexInput, portMode[0]); - EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); - EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &pBuffer[0], &pBuffer[1], - kPortIndexInput, kPortIndexOutput, portMode); - + ASSERT_NO_FATAL_FAILURE( + changeStateLoadedtoIdle(omxNode, observer, &pBuffer[0], &pBuffer[1], + kPortIndexInput, kPortIndexOutput, portMode)); // set state to executing - changeStateIdletoExecute(omxNode, observer); - + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); // dispatch buffers for (size_t i = 0; i < pBuffer[1].size(); i++) { - dispatchOutputBuffer(omxNode, &pBuffer[1], i, portMode[1]); + ASSERT_NO_FATAL_FAILURE( + dispatchOutputBuffer(omxNode, &pBuffer[1], i, portMode[1])); } for (size_t i = portBase; i < portBase + 2; i++) { @@ -944,8 +1218,8 @@ TEST_F(ComponentHidlTest, PortEnableDisable_Execute) { ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::TIMED_OUT); - allocatePortBuffers(omxNode, &pBuffer[i - portBase], i, - portMode[i - portBase]); + ASSERT_NO_FATAL_FAILURE(allocatePortBuffers( + omxNode, &pBuffer[i - portBase], i, portMode[i - portBase])); status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, &pBuffer[0], &pBuffer[1]); ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); @@ -958,12 +1232,13 @@ TEST_F(ComponentHidlTest, PortEnableDisable_Execute) { } } - // set state to Idle - changeStateExecutetoIdle(omxNode, observer, &pBuffer[0], &pBuffer[1]); - - // set state to Loaded - changeStateIdletoLoaded(omxNode, observer, &pBuffer[0], &pBuffer[1], - kPortIndexInput, kPortIndexOutput); + // set state to idle + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &pBuffer[0], &pBuffer[1])); + // set state to loaded + ASSERT_NO_FATAL_FAILURE( + changeStateIdletoLoaded(omxNode, observer, &pBuffer[0], &pBuffer[1], + kPortIndexInput, kPortIndexOutput)); } // port enable disable test - monkeying diff --git a/media/omx/1.0/vts/functional/master/Android.bp b/media/omx/1.0/vts/functional/master/Android.bp index e24b79b8a..4a45e6923 100644 --- a/media/omx/1.0/vts/functional/master/Android.bp +++ b/media/omx/1.0/vts/functional/master/Android.bp @@ -16,29 +16,7 @@ cc_test { name: "VtsHalMediaOmxV1_0TargetMasterTest", - defaults: ["hidl_defaults"], + defaults: ["VtsHalMediaOmxV1_0Defaults"], srcs: ["VtsHalMediaOmxV1_0TargetMasterTest.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidltransport", - "libhwbinder", - "libnativehelper", - "libutils", - "android.hidl.allocator@1.0", - "android.hidl.memory@1.0", - "android.hardware.media.omx@1.0", - ], - static_libs: ["VtsHalHidlTargetTestBase"], - cflags: [ - "-O0", - "-g", - ], - include_dirs: [ - "frameworks/native/include/media/openmax/", - "hardware/interfaces/media/omx/1.0/vts/functional/common", - ], } diff --git a/media/omx/1.0/vts/functional/master/VtsHalMediaOmxV1_0TargetMasterTest.cpp b/media/omx/1.0/vts/functional/master/VtsHalMediaOmxV1_0TargetMasterTest.cpp index 995886945..5a31d691c 100644 --- a/media/omx/1.0/vts/functional/master/VtsHalMediaOmxV1_0TargetMasterTest.cpp +++ b/media/omx/1.0/vts/functional/master/VtsHalMediaOmxV1_0TargetMasterTest.cpp @@ -15,6 +15,10 @@ */ #define LOG_TAG "media_omx_hidl_master_test" +#ifdef __LP64__ +#define OMX_ANDROID_COMPILE_AS_32BIT_ON_64BIT_PLATFORMS +#endif + #include <android-base/logging.h> #include <android/hardware/media/omx/1.0/IOmx.h> @@ -97,17 +101,22 @@ class ComponentTestEnvironment : public ::testing::Environment { static ComponentTestEnvironment* gEnv = nullptr; class MasterHidlTest : public ::testing::VtsHalHidlTargetTestBase { + private: + typedef ::testing::VtsHalHidlTargetTestBase Super; public: virtual void SetUp() override { + Super::SetUp(); omxStore = nullptr; - omxStore = ::testing::VtsHalHidlTargetTestBase::getService<IOmxStore>(); + omxStore = Super::getService<IOmxStore>(); ASSERT_NE(omxStore, nullptr); omx = nullptr; omx = omxStore->getOmx(gEnv->getInstance()); ASSERT_NE(omx, nullptr); } - virtual void TearDown() override {} + virtual void TearDown() override { + Super::TearDown(); + } sp<IOmxStore> omxStore; sp<IOmx> omx; @@ -141,6 +150,7 @@ TEST_F(MasterHidlTest, ListServiceAttr) { attributes = _nl; }) .isOk()); + ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); if (attributes.size() == 0) ALOGV("Warning, Attribute list empty"); } @@ -177,6 +187,7 @@ TEST_F(MasterHidlTest, ListNodes) { nodeList = _nl; }) .isOk()); + ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); if (nodeList.size() == 0) ALOGV("Warning, ComponentInfo list empty"); else { @@ -195,6 +206,7 @@ TEST_F(MasterHidlTest, ListNodes) { omxNode = _nl; }) .isOk()); + ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); if (omxNode == nullptr) { isPass = false; std::cerr << "[ !OK ] " << nodeList[i].mName.c_str() diff --git a/media/omx/1.0/vts/functional/video/Android.bp b/media/omx/1.0/vts/functional/video/Android.bp index 4e94f3b35..f0da2b39d 100644 --- a/media/omx/1.0/vts/functional/video/Android.bp +++ b/media/omx/1.0/vts/functional/video/Android.bp @@ -16,70 +16,21 @@ cc_test { name: "VtsHalMediaOmxV1_0TargetVideoDecTest", - defaults: ["hidl_defaults"], - srcs: ["VtsHalMediaOmxV1_0TargetVideoDecTest.cpp", - "media_video_hidl_test_common.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidlmemory", - "libhidltransport", - "libhwbinder", - "libnativehelper", - "libutils", - "libstagefright_foundation", - "android.hidl.allocator@1.0", - "android.hidl.memory@1.0", - "android.hardware.media.omx@1.0", - "android.hardware.graphics.allocator@2.0", - "android.hardware.graphics.mapper@2.0", - "android.hardware.graphics.common@1.0", - ], - static_libs: ["VtsHalHidlTargetTestBase", - "VtsHalMediaOmxV1_0CommonUtil"], - cflags: [ - "-O0", - "-g", - ], - include_dirs: [ - "frameworks/native/include/media/openmax/", - "hardware/interfaces/media/omx/1.0/vts/functional/common", + defaults: ["VtsHalMediaOmxV1_0Defaults"], + srcs: [ + "VtsHalMediaOmxV1_0TargetVideoDecTest.cpp", + "media_video_hidl_test_common.cpp" ], } cc_test { name: "VtsHalMediaOmxV1_0TargetVideoEncTest", - defaults: ["hidl_defaults"], - srcs: ["VtsHalMediaOmxV1_0TargetVideoEncTest.cpp", - "media_video_hidl_test_common.cpp"], - shared_libs: [ - "libbase", - "liblog", - "libcutils", - "libhidlbase", - "libhidlmemory", - "libhidltransport", - "libhwbinder", - "libnativehelper", - "libnativewindow", - "libutils", - "libstagefright_foundation", - "android.hidl.allocator@1.0", - "android.hidl.memory@1.0", - "android.hardware.media.omx@1.0", - "android.hardware.graphics.bufferqueue@1.0", - "android.hardware.graphics.mapper@2.0", + defaults: ["VtsHalMediaOmxV1_0Defaults"], + srcs: [ + "VtsHalMediaOmxV1_0TargetVideoEncTest.cpp", + "media_video_hidl_test_common.cpp" ], - static_libs: ["VtsHalHidlTargetTestBase", - "VtsHalMediaOmxV1_0CommonUtil"], - cflags: [ - "-O0", - "-g", - ], - include_dirs: [ - "frameworks/native/include/media/openmax/", - "hardware/interfaces/media/omx/1.0/vts/functional/common", + static_libs: [ + "libnativewindow", ], } 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 6e2e739cf..034992ec0 100644 --- a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp +++ b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoDecTest.cpp @@ -15,11 +15,12 @@ */ #define LOG_TAG "media_omx_hidl_video_dec_test" +#ifdef __LP64__ +#define OMX_ANDROID_COMPILE_AS_32BIT_ON_64BIT_PLATFORMS +#endif + #include <android-base/logging.h> -#include <android/hardware/graphics/allocator/2.0/IAllocator.h> -#include <android/hardware/graphics/mapper/2.0/IMapper.h> -#include <android/hardware/graphics/mapper/2.0/types.h> #include <android/hardware/media/omx/1.0/IOmx.h> #include <android/hardware/media/omx/1.0/IOmxNode.h> #include <android/hardware/media/omx/1.0/IOmxObserver.h> @@ -27,10 +28,7 @@ #include <android/hidl/allocator/1.0/IAllocator.h> #include <android/hidl/memory/1.0/IMapper.h> #include <android/hidl/memory/1.0/IMemory.h> -#include <cutils/atomic.h> -using ::android::hardware::graphics::common::V1_0::BufferUsage; -using ::android::hardware::graphics::common::V1_0::PixelFormat; using ::android::hardware::media::omx::V1_0::IOmx; using ::android::hardware::media::omx::V1_0::IOmxObserver; using ::android::hardware::media::omx::V1_0::IOmxNode; @@ -136,12 +134,22 @@ static ComponentTestEnvironment* gEnv = nullptr; // video decoder test fixture class class VideoDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { + private: + typedef ::testing::VtsHalHidlTargetTestBase Super; public: + ::std::string getTestCaseInfo() const override { + return ::std::string() + + "Component: " + gEnv->getComponent().c_str() + " | " + + "Role: " + gEnv->getRole().c_str() + " | " + + "Instance: " + gEnv->getInstance().c_str() + " | " + + "Res: " + gEnv->getRes().c_str(); + } + virtual void SetUp() override { + Super::SetUp(); disableTest = false; android::hardware::media::omx::V1_0::Status status; - omx = ::testing::VtsHalHidlTargetTestBase::getService<IOmx>( - gEnv->getInstance()); + omx = Super::getService<IOmx>(gEnv->getInstance()); ASSERT_NE(omx, nullptr); observer = new CodecObserver([this](Message msg, const BufferInfo* buffer) { @@ -158,6 +166,7 @@ class VideoDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { this->omxNode = _nl; }) .isOk()); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); ASSERT_NE(omxNode, nullptr); ASSERT_NE(gEnv->getRole().empty(), true) << "Invalid Component Role"; struct StringToName { @@ -209,6 +218,7 @@ class VideoDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { timestampUs = 0; timestampDevTest = false; isSecure = false; + portSettingsChange = false; size_t suffixLen = strlen(".secure"); if (strlen(gEnv->getComponent().c_str()) >= suffixLen) { isSecure = @@ -217,14 +227,19 @@ class VideoDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { ".secure"); } if (isSecure) disableTest = true; - if (disableTest) std::cout << "[ ] Warning ! Test Disabled\n"; + if (disableTest) std::cout << "[ WARN ] Test Disabled \n"; } virtual void TearDown() override { if (omxNode != nullptr) { + // If you have encountered a fatal failure, it is possible that + // freeNode() will not go through. Instead of hanging the app. + // let it pass through and report errors + if (::testing::Test::HasFatalFailure()) return; EXPECT_TRUE((omxNode->freeNode()).isOk()); omxNode = nullptr; } + Super::TearDown(); } // callback function to process messages received by onMessages() from IL @@ -260,9 +275,8 @@ class VideoDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { EXPECT_EQ(tsHit, true) << "TimeStamp not recognized"; } else { - std::cout - << "[ ] Warning ! Received non-zero " - "output / TimeStamp not recognized \n"; + std::cout << "[ INFO ] Received non-zero " + "output / TimeStamp not recognized \n"; } } } @@ -284,6 +298,13 @@ class VideoDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { } #endif } + } else if (msg.type == Message::Type::EVENT) { + if (msg.data.eventData.event == OMX_EventPortSettingsChanged) { + if ((msg.data.eventData.data2 == OMX_IndexParamPortDefinition || + msg.data.eventData.data2 == 0)) { + portSettingsChange = true; + } + } } } @@ -311,6 +332,7 @@ class VideoDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { ::android::List<uint64_t> timestampUslist; bool timestampDevTest; bool isSecure; + bool portSettingsChange; protected: static void description(const std::string& description) { @@ -358,122 +380,61 @@ void getInputChannelInfo(sp<IOmxNode> omxNode, OMX_U32 kPortIndexInput, } } +// number of elementary streams per component +#define STREAM_COUNT 2 // LookUpTable of clips and metadata for component testing void GetURLForComponent(VideoDecHidlTest::standardComp comp, char* mURL, - char* info) { + char* info, size_t streamIndex = 1) { struct CompToURL { VideoDecHidlTest::standardComp comp; - const char* mURL; - const char* info; + const char mURL[STREAM_COUNT][512]; + const char info[STREAM_COUNT][512]; }; + ASSERT_TRUE(streamIndex < STREAM_COUNT); + static const CompToURL kCompToURL[] = { {VideoDecHidlTest::standardComp::avc, - "bbb_avc_1920x1080_5000kbps_30fps.h264", - "bbb_avc_1920x1080_5000kbps_30fps.info"}, + {"bbb_avc_176x144_300kbps_60fps.h264", + "bbb_avc_640x360_768kbps_30fps.h264"}, + {"bbb_avc_176x144_300kbps_60fps.info", + "bbb_avc_640x360_768kbps_30fps.info"}}, {VideoDecHidlTest::standardComp::hevc, - "bbb_hevc_640x360_1600kbps_30fps.hevc", - "bbb_hevc_640x360_1600kbps_30fps.info"}, + {"bbb_hevc_176x144_176kbps_60fps.hevc", + "bbb_hevc_640x360_1600kbps_30fps.hevc"}, + {"bbb_hevc_176x144_176kbps_60fps.info", + "bbb_hevc_640x360_1600kbps_30fps.info"}}, {VideoDecHidlTest::standardComp::mpeg2, - "bbb_mpeg2_176x144_105kbps_25fps.m2v", - "bbb_mpeg2_176x144_105kbps_25fps.info"}, + {"bbb_mpeg2_176x144_105kbps_25fps.m2v", + "bbb_mpeg2_352x288_1mbps_60fps.m2v"}, + {"bbb_mpeg2_176x144_105kbps_25fps.info", + "bbb_mpeg2_352x288_1mbps_60fps.info"}}, {VideoDecHidlTest::standardComp::h263, - "bbb_h263_352x288_300kbps_12fps.h263", - "bbb_h263_352x288_300kbps_12fps.info"}, + {"", "bbb_h263_352x288_300kbps_12fps.h263"}, + {"", "bbb_h263_352x288_300kbps_12fps.info"}}, {VideoDecHidlTest::standardComp::mpeg4, - "bbb_mpeg4_1280x720_1000kbps_25fps.m4v", - "bbb_mpeg4_1280x720_1000kbps_25fps.info"}, - {VideoDecHidlTest::standardComp::vp8, "bbb_vp8_640x360_2mbps_30fps.vp8", - "bbb_vp8_640x360_2mbps_30fps.info"}, + {"", "bbb_mpeg4_352x288_512kbps_30fps.m4v"}, + {"", "bbb_mpeg4_352x288_512kbps_30fps.info"}}, + {VideoDecHidlTest::standardComp::vp8, + {"bbb_vp8_176x144_240kbps_60fps.vp8", + "bbb_vp8_640x360_2mbps_30fps.vp8"}, + {"bbb_vp8_176x144_240kbps_60fps.info", + "bbb_vp8_640x360_2mbps_30fps.info"}}, {VideoDecHidlTest::standardComp::vp9, - "bbb_vp9_640x360_1600kbps_30fps.vp9", - "bbb_vp9_640x360_1600kbps_30fps.info"}, + {"bbb_vp9_176x144_285kbps_60fps.vp9", + "bbb_vp9_640x360_1600kbps_30fps.vp9"}, + {"bbb_vp9_176x144_285kbps_60fps.info", + "bbb_vp9_640x360_1600kbps_30fps.info"}}, }; for (size_t i = 0; i < sizeof(kCompToURL) / sizeof(kCompToURL[0]); ++i) { if (kCompToURL[i].comp == comp) { - strcat(mURL, kCompToURL[i].mURL); - strcat(info, kCompToURL[i].info); + strcat(mURL, kCompToURL[i].mURL[streamIndex]); + strcat(info, kCompToURL[i].info[streamIndex]); return; } } } -void allocateGraphicBuffers(sp<IOmxNode> omxNode, OMX_U32 portIndex, - android::Vector<BufferInfo>* buffArray, - uint32_t nFrameWidth, uint32_t nFrameHeight, - int32_t* nStride, int format, uint32_t count) { - android::hardware::media::omx::V1_0::Status status; - sp<android::hardware::graphics::allocator::V2_0::IAllocator> allocator = - android::hardware::graphics::allocator::V2_0::IAllocator::getService(); - ASSERT_NE(nullptr, allocator.get()); - - sp<android::hardware::graphics::mapper::V2_0::IMapper> mapper = - android::hardware::graphics::mapper::V2_0::IMapper::getService(); - ASSERT_NE(mapper.get(), nullptr); - - android::hardware::graphics::mapper::V2_0::IMapper::BufferDescriptorInfo - descriptorInfo; - uint32_t usage; - - descriptorInfo.width = nFrameWidth; - descriptorInfo.height = nFrameHeight; - descriptorInfo.layerCount = 1; - descriptorInfo.format = static_cast<PixelFormat>(format); - descriptorInfo.usage = static_cast<uint64_t>(BufferUsage::CPU_READ_OFTEN); - omxNode->getGraphicBufferUsage( - portIndex, - [&status, &usage](android::hardware::media::omx::V1_0::Status _s, - uint32_t _n1) { - status = _s; - usage = _n1; - }); - if (status == android::hardware::media::omx::V1_0::Status::OK) { - descriptorInfo.usage |= usage; - } - - ::android::hardware::hidl_vec<uint32_t> descriptor; - android::hardware::graphics::mapper::V2_0::Error error; - mapper->createDescriptor( - descriptorInfo, [&error, &descriptor]( - android::hardware::graphics::mapper::V2_0::Error _s, - ::android::hardware::hidl_vec<uint32_t> _n1) { - error = _s; - descriptor = _n1; - }); - EXPECT_EQ(error, android::hardware::graphics::mapper::V2_0::Error::NONE); - - EXPECT_EQ(buffArray->size(), count); - - static volatile int32_t nextId = 0; - uint64_t id = static_cast<uint64_t>(getpid()) << 32; - allocator->allocate( - descriptor, count, - [&](android::hardware::graphics::mapper::V2_0::Error _s, uint32_t _n1, - const ::android::hardware::hidl_vec< - ::android::hardware::hidl_handle>& _n2) { - ASSERT_EQ(android::hardware::graphics::mapper::V2_0::Error::NONE, - _s); - *nStride = _n1; - ASSERT_EQ(count, _n2.size()); - for (uint32_t i = 0; i < count; i++) { - buffArray->editItemAt(i).omxBuffer.nativeHandle = _n2[i]; - buffArray->editItemAt(i).omxBuffer.attr.anwBuffer.width = - nFrameWidth; - buffArray->editItemAt(i).omxBuffer.attr.anwBuffer.height = - nFrameHeight; - buffArray->editItemAt(i).omxBuffer.attr.anwBuffer.stride = _n1; - buffArray->editItemAt(i).omxBuffer.attr.anwBuffer.format = - descriptorInfo.format; - buffArray->editItemAt(i).omxBuffer.attr.anwBuffer.usage = - descriptorInfo.usage; - buffArray->editItemAt(i).omxBuffer.attr.anwBuffer.layerCount = - descriptorInfo.layerCount; - buffArray->editItemAt(i).omxBuffer.attr.anwBuffer.id = - id | static_cast<uint32_t>(android_atomic_inc(&nextId)); - } - }); -} - // port settings reconfiguration during runtime. reconfigures frame dimensions void portReconfiguration(sp<IOmxNode> omxNode, sp<CodecObserver> observer, android::Vector<BufferInfo>* iBuffer, @@ -542,8 +503,7 @@ void portReconfiguration(sp<IOmxNode> omxNode, sp<CodecObserver> observer, nFrameWidth, nFrameHeight, 0, xFramerate); // If you can disable a port, then you should be able to - // enable - // it as well + // enable it as well status = omxNode->sendCommand( toRawCommandType(OMX_CommandPortEnable), kPortIndexOutput); ASSERT_EQ(status, @@ -556,23 +516,8 @@ void portReconfiguration(sp<IOmxNode> omxNode, sp<CodecObserver> observer, status, android::hardware::media::omx::V1_0::Status::TIMED_OUT); - allocatePortBuffers(omxNode, oBuffer, kPortIndexOutput, - oPortMode); - if (oPortMode != PortMode::PRESET_BYTE_BUFFER) { - OMX_PARAM_PORTDEFINITIONTYPE portDef; - - status = getPortParam(omxNode, OMX_IndexParamPortDefinition, - kPortIndexOutput, &portDef); - ASSERT_EQ( - status, - ::android::hardware::media::omx::V1_0::Status::OK); - allocateGraphicBuffers(omxNode, kPortIndexOutput, oBuffer, - portDef.format.video.nFrameWidth, - portDef.format.video.nFrameHeight, - &portDef.format.video.nStride, - portDef.format.video.eColorFormat, - portDef.nBufferCountActual); - } + ASSERT_NO_FATAL_FAILURE(allocatePortBuffers( + omxNode, oBuffer, kPortIndexOutput, oPortMode, true)); status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, oBuffer); ASSERT_EQ(status, @@ -593,23 +538,24 @@ void portReconfiguration(sp<IOmxNode> omxNode, sp<CodecObserver> observer, // dispatch output buffers for (size_t i = 0; i < oBuffer->size(); i++) { - dispatchOutputBuffer(omxNode, oBuffer, i, oPortMode); + ASSERT_NO_FATAL_FAILURE( + dispatchOutputBuffer(omxNode, oBuffer, i, oPortMode)); } } else { ASSERT_TRUE(false); } } else if (msg.data.eventData.data2 == OMX_IndexConfigCommonOutputCrop) { - std::cout << "[ ] Warning ! OMX_EventPortSettingsChanged/ " + std::cout << "[ INFO ] OMX_EventPortSettingsChanged/ " "OMX_IndexConfigCommonOutputCrop not handled \n"; } else if (msg.data.eventData.data2 == OMX_IndexVendorStartUnused + 3) { - std::cout << "[ ] Warning ! OMX_EventPortSettingsChanged/ " + std::cout << "[ INFO ] OMX_EventPortSettingsChanged/ " "kDescribeColorAspectsIndex not handled \n"; } } else if (msg.data.eventData.event == OMX_EventError) { - std::cout << "[ ] Warning ! OMX_EventError/ " + std::cerr << "[ ERROR ] OMX_EventError/ " "Decode Frame Call might be failed \n"; - return; + ASSERT_TRUE(false); } else { // something unexpected happened ASSERT_TRUE(false); @@ -624,17 +570,17 @@ 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, - kPortIndexInput, kPortIndexOutput, msg, - oPortMode, nullptr); + ASSERT_EQ(msg.type, Message::Type::EVENT); + ASSERT_NO_FATAL_FAILURE(portReconfiguration( + omxNode, observer, iBuffer, oBuffer, kPortIndexInput, + kPortIndexOutput, msg, oPortMode, nullptr)); } // status == TIMED_OUT, it could be due to process time being large // than DEFAULT_TIMEOUT or component needs output buffers to start @@ -647,9 +593,10 @@ void waitOnInputConsumption(sp<IOmxNode> omxNode, sp<CodecObserver> observer, // Dispatch an output buffer assuming outQueue.empty() is true size_t index; if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { - dispatchOutputBuffer(omxNode, oBuffer, index, oPortMode); + ASSERT_NO_FATAL_FAILURE( + dispatchOutputBuffer(omxNode, oBuffer, index, oPortMode)); + timeOut = TIMEOUT_COUNTER_Q; } - timeOut--; } } @@ -663,50 +610,27 @@ void decodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer, bool signalEOS = true) { android::hardware::media::omx::V1_0::Status status; Message msg; - - // dispatch output buffers - for (size_t i = 0; i < oBuffer->size(); i++) { - dispatchOutputBuffer(omxNode, oBuffer, i, oPortMode); - } - // dispatch input buffers + size_t index; uint32_t flags = 0; int frameID = offset; - for (size_t i = 0; (i < iBuffer->size()) && (frameID < (int)Info->size()) && - (frameID < (offset + range)); - i++) { - char* ipBuffer = static_cast<char*>( - static_cast<void*>((*iBuffer)[i].mMemory->getPointer())); - ASSERT_LE((*Info)[frameID].bytesCount, - static_cast<int>((*iBuffer)[i].mMemory->getSize())); - eleStream.read(ipBuffer, (*Info)[frameID].bytesCount); - ASSERT_EQ(eleStream.gcount(), (*Info)[frameID].bytesCount); - flags = (*Info)[frameID].flags; - if (signalEOS && ((frameID == (int)Info->size() - 1) || - (frameID == (offset + range - 1)))) - flags |= OMX_BUFFERFLAG_EOS; - dispatchInputBuffer(omxNode, iBuffer, i, (*Info)[frameID].bytesCount, - flags, (*Info)[frameID].timestamp); - frameID++; - } + int timeOut = TIMEOUT_COUNTER_Q; + bool iQueued, oQueued; - int timeOut = TIMEOUT_COUNTER; - bool stall = false; 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 && msg.type == Message::Type::EVENT) { - portReconfiguration(omxNode, observer, iBuffer, oBuffer, - kPortIndexInput, kPortIndexOutput, msg, - oPortMode, nullptr); + ASSERT_NO_FATAL_FAILURE(portReconfiguration( + omxNode, observer, iBuffer, oBuffer, kPortIndexInput, + kPortIndexOutput, msg, oPortMode, nullptr)); } if (frameID == (int)Info->size() || frameID == (offset + range)) break; // Dispatch input buffer - size_t index = 0; if ((index = getEmptyBufferID(iBuffer)) < iBuffer->size()) { char* ipBuffer = static_cast<char*>( static_cast<void*>((*iBuffer)[index].mMemory->getPointer())); @@ -715,28 +639,33 @@ void decodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer, eleStream.read(ipBuffer, (*Info)[frameID].bytesCount); ASSERT_EQ(eleStream.gcount(), (*Info)[frameID].bytesCount); flags = (*Info)[frameID].flags; + // Indicate to omx core that the buffer contains a full frame worth + // of data + flags |= OMX_BUFFERFLAG_ENDOFFRAME; + // Indicate the omx core that this is the last buffer it needs to + // process if (signalEOS && ((frameID == (int)Info->size() - 1) || (frameID == (offset + range - 1)))) flags |= OMX_BUFFERFLAG_EOS; - dispatchInputBuffer(omxNode, iBuffer, index, - (*Info)[frameID].bytesCount, flags, - (*Info)[frameID].timestamp); + ASSERT_NO_FATAL_FAILURE(dispatchInputBuffer( + omxNode, iBuffer, index, (*Info)[frameID].bytesCount, flags, + (*Info)[frameID].timestamp)); frameID++; - stall = false; - } else - stall = true; + iQueued = true; + } + // Dispatch output buffer if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { - dispatchOutputBuffer(omxNode, oBuffer, index, oPortMode); - stall = false; - } else - stall = true; - if (stall) - timeOut--; + ASSERT_NO_FATAL_FAILURE( + dispatchOutputBuffer(omxNode, oBuffer, index, oPortMode)); + oQueued = true; + } + // Reset Counters when either input or output buffer is dispatched + 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; + ASSERT_TRUE(false) << "Wait on Input/Output is found indefinite"; } } } @@ -829,7 +758,7 @@ void getDefaultColorFormat(sp<IOmxNode> omxNode, OMX_U32 kPortIndexOutput, OMX_VIDEO_PARAM_PORTFORMATTYPE portFormat; *eColorFormat = OMX_COLOR_FormatUnused; portFormat.nIndex = 0; - while (1) { + while (portFormat.nIndex < 512) { status = getPortParam(omxNode, OMX_IndexParamVideoPortFormat, kPortIndexOutput, &portFormat); if (status != ::android::hardware::media::omx::V1_0::Status::OK) break; @@ -843,7 +772,9 @@ void getDefaultColorFormat(sp<IOmxNode> omxNode, OMX_U32 kPortIndexOutput, break; } if (OMX_COLOR_FormatYUV420SemiPlanar == portFormat.eColorFormat || - OMX_COLOR_FormatYUV420Planar == portFormat.eColorFormat) { + OMX_COLOR_FormatYUV420Planar == portFormat.eColorFormat || + OMX_COLOR_FormatYUV420PackedPlanar == portFormat.eColorFormat || + OMX_COLOR_FormatYUV420PackedSemiPlanar == portFormat.eColorFormat) { *eColorFormat = portFormat.eColorFormat; break; } @@ -960,47 +891,184 @@ TEST_F(VideoDecHidlTest, DecodeTest) { setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate); - // disabling adaptive playback. - omxNode->prepareForAdaptivePlayback(kPortIndexOutput, false, 1920, 1080); - android::Vector<BufferInfo> iBuffer, oBuffer; // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode); + ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle( + omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, + kPortIndexOutput, portMode, true)); // set state to executing - changeStateIdletoExecute(omxNode, observer); - - if (portMode[1] != PortMode::PRESET_BYTE_BUFFER) { - OMX_PARAM_PORTDEFINITIONTYPE portDef; - - status = getPortParam(omxNode, OMX_IndexParamPortDefinition, - kPortIndexOutput, &portDef); - ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); - allocateGraphicBuffers( - omxNode, kPortIndexOutput, &oBuffer, - portDef.format.video.nFrameWidth, portDef.format.video.nFrameHeight, - &portDef.format.video.nStride, portDef.format.video.eColorFormat, - portDef.nBufferCountActual); - } + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); // Port Reconfiguration eleStream.open(mURL, std::ifstream::binary); ASSERT_EQ(eleStream.is_open(), true); - decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput, eleStream, &Info, 0, (int)Info.size(), - portMode[1]); + ASSERT_NO_FATAL_FAILURE(decodeNFrames( + omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, + kPortIndexOutput, eleStream, &Info, 0, (int)Info.size(), portMode[1])); eleStream.close(); - waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode[1]); - testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, portMode, - portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr); + ASSERT_NO_FATAL_FAILURE( + waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput, portMode[1])); + ASSERT_NO_FATAL_FAILURE(testEOS( + omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, portMode, + portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr)); if (timestampDevTest) EXPECT_EQ(timestampUslist.empty(), true); // set state to idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); // set state to executing - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); +} + +// Test for adaptive playback support +TEST_F(VideoDecHidlTest, AdaptivePlaybackTest) { + description("Tests for Adaptive Playback support"); + if (disableTest) return; + if (!(compName == avc || compName == hevc || compName == vp8 || + compName == vp9 || compName == mpeg2)) + return; + android::hardware::media::omx::V1_0::Status status; + uint32_t kPortIndexInput = 0, kPortIndexOutput = 1; + status = setRole(omxNode, gEnv->getRole().c_str()); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + OMX_PORT_PARAM_TYPE params; + status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms); + if (status == ::android::hardware::media::omx::V1_0::Status::OK) { + ASSERT_EQ(params.nPorts, 2U); + kPortIndexInput = params.nStartPortNumber; + kPortIndexOutput = kPortIndexInput + 1; + } + + // set port mode + portMode[0] = PortMode::PRESET_BYTE_BUFFER; + portMode[1] = PortMode::DYNAMIC_ANW_BUFFER; + status = omxNode->setPortMode(kPortIndexInput, portMode[0]); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); + if (status != ::android::hardware::media::omx::V1_0::Status::OK) { + portMode[1] = PortMode::PRESET_BYTE_BUFFER; + status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + } + + // prepare for adaptive playback + uint32_t adaptiveMaxWidth = 320; + uint32_t adaptiveMaxHeight = 240; + status = omxNode->prepareForAdaptivePlayback( + kPortIndexOutput, true, adaptiveMaxWidth, adaptiveMaxHeight); + if (strncmp(gEnv->getComponent().c_str(), "OMX.google.", 11) == 0) { + // SoftOMX Decoders donot support graphic buffer modes. So for them + // support for adaptive play back is mandatory in Byte Buffer mode + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + } else { + // for vendor codecs, support for adaptive play back is optional + // in byte buffer mode. + if (portMode[1] == PortMode::PRESET_BYTE_BUFFER) return; + if (status != ::android::hardware::media::omx::V1_0::Status::OK) return; + } + + // TODO: Handle this better !!! + // Without the knowledge of the maximum resolution of the frame to be + // decoded it is not possible to choose the size of the input buffer. + // The value below is based on the info. files of clips in res folder. + status = setPortBufferSize(omxNode, kPortIndexInput, 482304); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + + // set Port Params + uint32_t nFrameWidth, nFrameHeight, xFramerate; + getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight, + &xFramerate); + // get default color format + OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused; + getDefaultColorFormat(omxNode, kPortIndexOutput, portMode[1], + &eColorFormat); + ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused); + status = + setVideoPortFormat(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, + eColorFormat, xFramerate); + EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, + eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate); + + android::Vector<BufferInfo> iBuffer, oBuffer; + + // set state to idle + ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle( + omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, + kPortIndexOutput, portMode, true)); + // set state to executing + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); + + timestampDevTest = true; + uint32_t timestampOffset = 0; + for (uint32_t i = 0; i < STREAM_COUNT * 2; i++) { + std::ifstream eleStream, eleInfo; + char mURL[512], info[512]; + android::Vector<FrameData> Info; + strcpy(mURL, gEnv->getRes().c_str()); + strcpy(info, gEnv->getRes().c_str()); + GetURLForComponent(compName, mURL, info, i % STREAM_COUNT); + eleInfo.open(info); + ASSERT_EQ(eleInfo.is_open(), true); + int bytesCount = 0; + uint32_t flags = 0; + uint32_t timestamp = 0; + uint32_t timestampMax = 0; + while (1) { + if (!(eleInfo >> bytesCount)) break; + eleInfo >> flags; + eleInfo >> timestamp; + timestamp += timestampOffset; + Info.push_back({bytesCount, flags, timestamp}); + if (timestampDevTest && (flags != OMX_BUFFERFLAG_CODECCONFIG)) + timestampUslist.push_back(timestamp); + if (timestampMax < timestamp) timestampMax = timestamp; + } + timestampOffset = timestampMax; + eleInfo.close(); + + // Port Reconfiguration + eleStream.open(mURL, std::ifstream::binary); + ASSERT_EQ(eleStream.is_open(), true); + ASSERT_NO_FATAL_FAILURE( + decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput, eleStream, &Info, + 0, (int)Info.size(), portMode[1], false)); + eleStream.close(); + + getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, + &nFrameHeight, &xFramerate); + if ((nFrameWidth > adaptiveMaxWidth) || + (nFrameHeight > adaptiveMaxHeight)) { + if (nFrameWidth > adaptiveMaxWidth) adaptiveMaxWidth = nFrameWidth; + if (nFrameHeight > adaptiveMaxHeight) + adaptiveMaxHeight = nFrameHeight; + EXPECT_TRUE(portSettingsChange); + } else { + // In DynamicANW Buffer mode, its ok to do a complete + // reconfiguration even if a partial reconfiguration is sufficient. + if (portMode[1] != PortMode::DYNAMIC_ANW_BUFFER) + EXPECT_FALSE(portSettingsChange); + } + portSettingsChange = false; + } + ASSERT_NO_FATAL_FAILURE( + waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput, portMode[1])); + ASSERT_NO_FATAL_FAILURE(testEOS( + omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode, + portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr)); + if (timestampDevTest) EXPECT_EQ(timestampUslist.empty(), true); + // set state to idle + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); + // set state to executing + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); } // end of sequence test @@ -1044,25 +1112,29 @@ TEST_F(VideoDecHidlTest, EOSTest_M) { android::Vector<BufferInfo> iBuffer, oBuffer; // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode); + ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle( + omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, + kPortIndexOutput, portMode, true)); // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); // request EOS at the start - testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode, - portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr); - flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(testEOS( + omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode, + portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr)); + ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput)); EXPECT_GE(framesReceived, 0U); framesReceived = 0; timestampUs = 0; // set state to idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); // set state to executing - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); } // end of sequence test @@ -1132,50 +1204,58 @@ TEST_F(VideoDecHidlTest, ThumbnailTest) { android::Vector<BufferInfo> iBuffer, oBuffer; // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode); + ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle( + omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, + kPortIndexOutput, portMode, true)); // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); // request EOS for thumbnail size_t i = 0; while (!(Info[i].flags & OMX_BUFFERFLAG_SYNCFRAME)) i++; eleStream.open(mURL, std::ifstream::binary); ASSERT_EQ(eleStream.is_open(), true); - decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput, eleStream, &Info, 0, i + 1, portMode[1]); + ASSERT_NO_FATAL_FAILURE(decodeNFrames( + omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, + kPortIndexOutput, eleStream, &Info, 0, i + 1, portMode[1])); eleStream.close(); - waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode[1]); - testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, portMode, - portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr); - flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE( + waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput, portMode[1])); + ASSERT_NO_FATAL_FAILURE(testEOS( + omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, portMode, + portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr)); + ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput)); EXPECT_GE(framesReceived, 1U); framesReceived = 0; timestampUs = 0; eleStream.open(mURL, std::ifstream::binary); ASSERT_EQ(eleStream.is_open(), true); - decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput, eleStream, &Info, 0, i + 1, portMode[1], - false); + ASSERT_NO_FATAL_FAILURE(decodeNFrames( + omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, + kPortIndexOutput, eleStream, &Info, 0, i + 1, portMode[1], false)); eleStream.close(); - waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode[1]); - testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode, - portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr); - flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE( + waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput, portMode[1])); + ASSERT_NO_FATAL_FAILURE(testEOS( + omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode, + portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr)); + ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput)); EXPECT_GE(framesReceived, 1U); framesReceived = 0; timestampUs = 0; // set state to idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); // set state to executing - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); } // end of sequence test @@ -1221,10 +1301,16 @@ TEST_F(VideoDecHidlTest, SimpleEOSTest) { ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); // set port mode + portMode[0] = PortMode::PRESET_BYTE_BUFFER; + portMode[1] = PortMode::PRESET_ANW_BUFFER; status = omxNode->setPortMode(kPortIndexInput, portMode[0]); ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); - ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + if (status != ::android::hardware::media::omx::V1_0::Status::OK) { + portMode[1] = PortMode::PRESET_BYTE_BUFFER; + status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + } // set Port Params uint32_t nFrameWidth, nFrameHeight, xFramerate; @@ -1245,32 +1331,38 @@ TEST_F(VideoDecHidlTest, SimpleEOSTest) { android::Vector<BufferInfo> iBuffer, oBuffer; // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode); + ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle( + omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, + kPortIndexOutput, portMode, true)); // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); // request EOS at the end eleStream.open(mURL, std::ifstream::binary); ASSERT_EQ(eleStream.is_open(), true); - decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput, eleStream, &Info, 0, (int)Info.size(), - portMode[1], false); + ASSERT_NO_FATAL_FAILURE(decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput, + eleStream, &Info, 0, (int)Info.size(), + portMode[1], false)); eleStream.close(); - waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode[1]); - testEOS(omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode, - portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr); - flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE( + waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput, portMode[1])); + ASSERT_NO_FATAL_FAILURE(testEOS( + omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode, + portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr)); + ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput)); framesReceived = 0; timestampUs = 0; // set state to idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); // set state to executing - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); } // test input/output port flush @@ -1340,10 +1432,11 @@ TEST_F(VideoDecHidlTest, FlushTest) { android::Vector<BufferInfo> iBuffer, oBuffer; // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode); + ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle( + omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, + kPortIndexOutput, portMode, true)); // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); // Decode 128 frames and flush. here 128 is chosen to ensure there is a key // frame after this so that the below section can be convered for all @@ -1351,12 +1444,11 @@ TEST_F(VideoDecHidlTest, FlushTest) { int nFrames = 128; eleStream.open(mURL, std::ifstream::binary); ASSERT_EQ(eleStream.is_open(), true); - 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); + ASSERT_NO_FATAL_FAILURE(decodeNFrames( + omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, + kPortIndexOutput, eleStream, &Info, 0, nFrames, portMode[1], false)); + ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput)); framesReceived = 0; // Seek to next key frame and start decoding till the end @@ -1373,21 +1465,23 @@ TEST_F(VideoDecHidlTest, FlushTest) { index++; } if (keyFrame) { - decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput, eleStream, &Info, index, - Info.size() - index, portMode[1], false); + ASSERT_NO_FATAL_FAILURE( + decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput, eleStream, &Info, + index, Info.size() - index, portMode[1], false)); } - // Note: Assumes 200 ms is enough to end any decode call that started eleStream.close(); - flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, - kPortIndexOutput, 200000); + ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput)); framesReceived = 0; // set state to idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); // set state to executing - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); } int main(int argc, char** argv) { diff --git a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp index bbe08435d..099658f8a 100644 --- a/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp +++ b/media/omx/1.0/vts/functional/video/VtsHalMediaOmxV1_0TargetVideoEncTest.cpp @@ -147,12 +147,22 @@ static ComponentTestEnvironment* gEnv = nullptr; // video encoder test fixture class class VideoEncHidlTest : public ::testing::VtsHalHidlTargetTestBase { + private: + typedef ::testing::VtsHalHidlTargetTestBase Super; public: + ::std::string getTestCaseInfo() const override { + return ::std::string() + + "Component: " + gEnv->getComponent().c_str() + " | " + + "Role: " + gEnv->getRole().c_str() + " | " + + "Instance: " + gEnv->getInstance().c_str() + " | " + + "Res: " + gEnv->getRes().c_str(); + } + virtual void SetUp() override { + Super::SetUp(); disableTest = false; android::hardware::media::omx::V1_0::Status status; - omx = ::testing::VtsHalHidlTargetTestBase::getService<IOmx>( - gEnv->getInstance()); + omx = Super::getService<IOmx>(gEnv->getInstance()); ASSERT_NE(omx, nullptr); observer = new CodecObserver([this](Message msg, const BufferInfo* buffer) { @@ -169,6 +179,7 @@ class VideoEncHidlTest : public ::testing::VtsHalHidlTargetTestBase { this->omxNode = _nl; }) .isOk()); + ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); ASSERT_NE(omxNode, nullptr); ASSERT_NE(gEnv->getRole().empty(), true) << "Invalid Component Role"; struct StringToName { @@ -227,14 +238,19 @@ class VideoEncHidlTest : public ::testing::VtsHalHidlTargetTestBase { ".secure"); } if (isSecure) disableTest = true; - if (disableTest) std::cerr << "[ ] Warning ! Test Disabled\n"; + if (disableTest) std::cout << "[ WARN ] Test Disabled \n"; } virtual void TearDown() override { if (omxNode != nullptr) { + // If you have encountered a fatal failure, it is possible that + // freeNode() will not go through. Instead of hanging the app. + // let it pass through and report errors + if (::testing::Test::HasFatalFailure()) return; EXPECT_TRUE((omxNode->freeNode()).isOk()); omxNode = nullptr; } + Super::TearDown(); } // callback function to process messages received by onMessages() from IL @@ -267,9 +283,8 @@ class VideoEncHidlTest : public ::testing::VtsHalHidlTargetTestBase { EXPECT_EQ(tsHit, true) << "TimeStamp not recognized"; } else { - std::cerr - << "[ ] Warning ! Received non-zero " - "output / TimeStamp not recognized \n"; + std::cout << "[ INFO ] Received non-zero " + "output / TimeStamp not recognized \n"; } } } @@ -431,7 +446,7 @@ void requestIDR(sp<IOmxNode> omxNode, OMX_U32 portIndex) { status = setPortConfig(omxNode, OMX_IndexConfigVideoIntraVOPRefresh, portIndex, ¶m); if (status != ::android::hardware::media::omx::V1_0::Status::OK) - std::cerr << "[ ] Warning ! unable to request IDR \n"; + std::cout << "[ INFO ] unable to request IDR \n"; } // modify bitrate @@ -442,7 +457,7 @@ void changeBitrate(sp<IOmxNode> omxNode, OMX_U32 portIndex, uint32_t nBitrate) { status = setPortConfig(omxNode, OMX_IndexConfigVideoBitrate, portIndex, ¶m); if (status != ::android::hardware::media::omx::V1_0::Status::OK) - std::cerr << "[ ] Warning ! unable to change Bitrate \n"; + std::cout << "[ INFO ] unable to change Bitrate \n"; } // modify framerate @@ -454,7 +469,7 @@ Return<android::hardware::media::omx::V1_0::Status> changeFrameRate( status = setPortConfig(omxNode, OMX_IndexConfigVideoFramerate, portIndex, ¶m); if (status != ::android::hardware::media::omx::V1_0::Status::OK) - std::cerr << "[ ] Warning ! unable to change Framerate \n"; + std::cout << "[ INFO ] unable to change Framerate \n"; return status; } @@ -468,7 +483,7 @@ void changeRefreshPeriod(sp<IOmxNode> omxNode, OMX_U32 portIndex, (OMX_INDEXTYPE)OMX_IndexConfigAndroidIntraRefresh, portIndex, ¶m); if (status != ::android::hardware::media::omx::V1_0::Status::OK) - std::cerr << "[ ] Warning ! unable to change Refresh Period\n"; + std::cout << "[ INFO ] unable to change Refresh Period\n"; } // set intra refresh interval @@ -494,7 +509,7 @@ void setRefreshPeriod(sp<IOmxNode> omxNode, OMX_U32 portIndex, status = setPortParam(omxNode, OMX_IndexParamVideoIntraRefresh, portIndex, ¶m); if (status != ::android::hardware::media::omx::V1_0::Status::OK) - std::cerr << "[ ] Warning ! unable to set Refresh Period \n"; + std::cout << "[ INFO ] unable to set Refresh Period \n"; } void setLatency(sp<IOmxNode> omxNode, OMX_U32 portIndex, uint32_t latency) { @@ -504,7 +519,7 @@ void setLatency(sp<IOmxNode> omxNode, OMX_U32 portIndex, uint32_t latency) { status = setPortConfig(omxNode, (OMX_INDEXTYPE)OMX_IndexConfigLatency, portIndex, ¶m); if (status != ::android::hardware::media::omx::V1_0::Status::OK) - std::cerr << "[ ] Warning ! unable to set latency\n"; + std::cout << "[ INFO ] unable to set latency\n"; } void getLatency(sp<IOmxNode> omxNode, OMX_U32 portIndex, uint32_t* latency) { @@ -513,7 +528,7 @@ void getLatency(sp<IOmxNode> omxNode, OMX_U32 portIndex, uint32_t* latency) { status = getPortConfig(omxNode, (OMX_INDEXTYPE)OMX_IndexConfigLatency, portIndex, ¶m); if (status != ::android::hardware::media::omx::V1_0::Status::OK) - std::cerr << "[ ] Warning ! unable to get latency\n"; + std::cout << "[ INFO ] unable to get latency\n"; else *latency = param.nU32; } @@ -521,12 +536,15 @@ void getLatency(sp<IOmxNode> omxNode, OMX_U32 portIndex, uint32_t* latency) { // Set Default port param. void setDefaultPortParam(sp<IOmxNode> omxNode, OMX_U32 portIndex, OMX_VIDEO_CODINGTYPE eCompressionFormat, + OMX_U32 nFrameWidth, OMX_U32 nFrameHeight, OMX_U32 nBitrate, OMX_U32 xFramerate) { android::hardware::media::omx::V1_0::Status status; OMX_PARAM_PORTDEFINITIONTYPE portDef; status = getPortParam(omxNode, OMX_IndexParamPortDefinition, portIndex, &portDef); EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); + portDef.format.video.nFrameWidth = nFrameWidth; + portDef.format.video.nFrameHeight = nFrameHeight; portDef.format.video.nBitrate = nBitrate; portDef.format.video.xFramerate = xFramerate; portDef.format.video.bFlagErrorConcealment = OMX_TRUE; @@ -598,13 +616,13 @@ 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); - EXPECT_EQ(status, + observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_Q, iBuffer, oBuffer); + ASSERT_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 @@ -621,7 +639,9 @@ void waitOnInputConsumption(sp<IOmxNode> omxNode, sp<CodecObserver> observer, // Dispatch an output buffer assuming outQueue.empty() is true size_t index; if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { - dispatchOutputBuffer(omxNode, oBuffer, index); + ASSERT_NO_FATAL_FAILURE( + dispatchOutputBuffer(omxNode, oBuffer, index)); + timeOut = TIMEOUT_COUNTER_Q; } } } @@ -968,57 +988,25 @@ void encodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer, sp<CodecProducerListener> listener = nullptr) { android::hardware::media::omx::V1_0::Status status; Message msg; - uint32_t ipCount = 0; + uint64_t timestamp = 0; + uint32_t flags = 0; + int timeOut = TIMEOUT_COUNTER_Q; + bool iQueued, oQueued; + uint32_t ipCount = 0; if (ipCount == 0) { status = changeFrameRate(omxNode, portIndexOutput, (24U << 16)); if (status == ::android::hardware::media::omx::V1_0::Status::OK) xFramerate = (24U << 16); } - - // dispatch output buffers - for (size_t i = 0; i < oBuffer->size(); i++) { - dispatchOutputBuffer(omxNode, oBuffer, i); - } - // dispatch input buffers int32_t timestampIncr = (int)((float)1000000 / (xFramerate >> 16)); - // timestamp scale = Nano sec - if (inputDataIsMeta) timestampIncr *= 1000; - uint64_t timestamp = 0; - uint32_t flags = 0; - for (size_t i = 0; i < iBuffer->size() && nFrames != 0; i++) { - if (inputDataIsMeta) { - if (listener->freeBuffers > listener->minUnDequeuedCount) { - if (dispatchGraphicBuffer(omxNode, producer, listener, iBuffer, - portIndexInput, eleStream, timestamp)) - break; - timestamp += timestampIncr; - nFrames--; - ipCount++; - } - } else { - char* ipBuffer = static_cast<char*>( - static_cast<void*>((*iBuffer)[i].mMemory->getPointer())); - ASSERT_LE(bytesCount, - static_cast<int>((*iBuffer)[i].mMemory->getSize())); - if (fillByteBuffer(omxNode, ipBuffer, portIndexInput, eleStream)) - break; - if (signalEOS && (nFrames == 1)) flags = OMX_BUFFERFLAG_EOS; - dispatchInputBuffer(omxNode, iBuffer, i, bytesCount, flags, - timestamp); - if (timestampUslist) timestampUslist->push_back(timestamp); - timestamp += timestampIncr; - nFrames--; - ipCount++; - } - } + if (inputDataIsMeta) timestampIncr *= 1000; // timestamp scale: Nano sec - int timeOut = TIMEOUT_COUNTER; - bool stall = false; 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) { ASSERT_EQ(msg.type, Message::Type::EVENT); if (msg.data.eventData.event == OMX_EventPortSettingsChanged) { @@ -1026,8 +1014,10 @@ void encodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer, ASSERT_EQ(msg.data.eventData.data2, OMX_IndexConfigAndroidIntraRefresh); } else if (msg.data.eventData.event == OMX_EventError) { - EXPECT_TRUE(false) << "Received OMX_EventError, not sure why"; - break; + ASSERT_TRUE(false) << "Received OMX_EventError, not sure why"; + } else if (msg.data.eventData.event == OMX_EventDataSpaceChanged) { + // TODO: how am i supposed to respond now? + std::cout << "[ INFO ] OMX_EventDataSpaceChanged \n"; } else { ASSERT_TRUE(false); } @@ -1040,14 +1030,17 @@ void encodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer, if (inputDataIsMeta) { if (listener->freeBuffers > listener->minUnDequeuedCount) { if (dispatchGraphicBuffer(omxNode, producer, listener, iBuffer, - portIndexInput, eleStream, timestamp)) - break; + portIndexInput, eleStream, + timestamp)) { + if (::testing::Test::HasFailure()) + ASSERT_TRUE(false); + else + break; + } timestamp += timestampIncr; nFrames--; ipCount++; - stall = false; - } else { - stall = true; + iQueued = true; } } else { if ((index = getEmptyBufferID(iBuffer)) < iBuffer->size()) { @@ -1059,31 +1052,32 @@ void encodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer, if (fillByteBuffer(omxNode, ipBuffer, portIndexInput, eleStream)) break; - if (signalEOS && (nFrames == 1)) flags = OMX_BUFFERFLAG_EOS; - dispatchInputBuffer(omxNode, iBuffer, index, bytesCount, flags, - timestamp); + flags = OMX_BUFFERFLAG_ENDOFFRAME; + if (signalEOS && (nFrames == 1)) flags |= OMX_BUFFERFLAG_EOS; + ASSERT_NO_FATAL_FAILURE(dispatchInputBuffer( + omxNode, iBuffer, index, bytesCount, flags, timestamp)); if (timestampUslist) timestampUslist->push_back(timestamp); timestamp += timestampIncr; nFrames--; ipCount++; - 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--; + ASSERT_NO_FATAL_FAILURE( + dispatchOutputBuffer(omxNode, oBuffer, index)); + oQueued = true; + } + // Reset Counters when either input or output buffer is dispatched + 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; + ASSERT_TRUE(false) << "Wait on Input/Output is found indefinite"; } + // Runtime Param Configuration if (ipCount == 15) { changeBitrate(omxNode, portIndexOutput, 768000); requestIDR(omxNode, portIndexOutput); @@ -1153,7 +1147,7 @@ TEST_F(VideoEncHidlTest, BufferSourceCallBacks) { xFramerate, eColorFormat); sp<DummyBufferSource> buffersource = new DummyBufferSource(omxNode); - EXPECT_NE(buffersource, nullptr); + ASSERT_NE(buffersource, nullptr); status = omxNode->setInputSurface(buffersource); ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); @@ -1167,20 +1161,20 @@ TEST_F(VideoEncHidlTest, BufferSourceCallBacks) { ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &buffersource->iBuffer, - &buffersource->oBuffer, kPortIndexInput, - kPortIndexOutput, portMode); + ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle( + omxNode, observer, &buffersource->iBuffer, &buffersource->oBuffer, + kPortIndexInput, kPortIndexOutput, portMode)); // set state to executing - changeStateIdletoExecute(omxNode, observer); - testEOS(omxNode, observer, &buffersource->iBuffer, &buffersource->oBuffer, - false, eosFlag); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); + ASSERT_NO_FATAL_FAILURE(testEOS(omxNode, observer, &buffersource->iBuffer, + &buffersource->oBuffer, false, eosFlag)); // set state to idle - changeStateExecutetoIdle(omxNode, observer, &buffersource->iBuffer, - &buffersource->oBuffer); + ASSERT_NO_FATAL_FAILURE(changeStateExecutetoIdle( + omxNode, observer, &buffersource->iBuffer, &buffersource->oBuffer)); // set state to executing - changeStateIdletoLoaded(omxNode, observer, &buffersource->iBuffer, - &buffersource->oBuffer, kPortIndexInput, - kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded( + omxNode, observer, &buffersource->iBuffer, &buffersource->oBuffer, + kPortIndexInput, kPortIndexOutput)); // test for callbacks EXPECT_EQ(buffersource->callback, 31); } @@ -1234,8 +1228,9 @@ TEST_F(VideoEncHidlTest, EncodeTest) { // Configure output port uint32_t nBitRate = 512000; - setDefaultPortParam(omxNode, kPortIndexOutput, eCompressionFormat, nBitRate, - xFramerate); + ASSERT_NO_FATAL_FAILURE( + setDefaultPortParam(omxNode, kPortIndexOutput, eCompressionFormat, + nFrameWidth, nFrameHeight, nBitRate, xFramerate)); setRefreshPeriod(omxNode, kPortIndexOutput, 0); unsigned int index; @@ -1252,8 +1247,7 @@ TEST_F(VideoEncHidlTest, EncodeTest) { status = setParam(omxNode, static_cast<OMX_INDEXTYPE>(index), ¶m); } if (status != ::android::hardware::media::omx::V1_0::Status::OK) - std::cerr - << "[ ] Warning ! unable to prependSPSPPSToIDRFrames\n"; + std::cout << "[ INFO ] unable to prependSPSPPSToIDRFrames\n"; else prependSPSPPS = true; @@ -1272,27 +1266,32 @@ TEST_F(VideoEncHidlTest, EncodeTest) { android::Vector<BufferInfo> iBuffer, oBuffer; // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode); + ASSERT_NO_FATAL_FAILURE( + changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput, portMode)); // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); eleStream.open(mURL, std::ifstream::binary); ASSERT_EQ(eleStream.is_open(), true); - encodeNFrames(omxNode, observer, kPortIndexInput, kPortIndexOutput, - &iBuffer, &oBuffer, 32, xFramerate, - (nFrameWidth * nFrameHeight * 3) >> 1, eleStream, - ×tampUslist); + ASSERT_NO_FATAL_FAILURE(encodeNFrames( + omxNode, observer, kPortIndexInput, kPortIndexOutput, &iBuffer, + &oBuffer, 32, xFramerate, (nFrameWidth * nFrameHeight * 3) >> 1, + eleStream, ×tampUslist)); eleStream.close(); - waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer); - testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag); + ASSERT_NO_FATAL_FAILURE( + waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer)); + ASSERT_NO_FATAL_FAILURE( + testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag)); if (timestampDevTest) EXPECT_EQ(timestampUslist.empty(), true); // set state to idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); // set state to executing - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); } // test raw stream encode (input is ANW buffers) @@ -1319,6 +1318,11 @@ TEST_F(VideoEncHidlTest, EncodeTestBufferMetaModes) { setupRAWPort(omxNode, kPortIndexInput, nFrameWidth, nFrameHeight, 0, xFramerate, eColorFormat); + // Configure output port + uint32_t nBitRate = 512000; + ASSERT_NO_FATAL_FAILURE( + setDefaultPortParam(omxNode, kPortIndexOutput, eCompressionFormat, + nFrameWidth, nFrameHeight, nBitRate, xFramerate)); // CreateInputSurface EXPECT_TRUE(omx->createInputSurface( [&](android::hardware::media::omx::V1_0::Status _s, @@ -1425,28 +1429,32 @@ TEST_F(VideoEncHidlTest, EncodeTestBufferMetaModes) { android::Vector<BufferInfo> iBuffer, oBuffer; // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode); + ASSERT_NO_FATAL_FAILURE( + changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput, portMode)); // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); eleStream.open(mURL, std::ifstream::binary); ASSERT_EQ(eleStream.is_open(), true); - encodeNFrames(omxNode, observer, kPortIndexInput, kPortIndexOutput, - &iBuffer, &oBuffer, 1024, xFramerate, - (nFrameWidth * nFrameHeight * 3) >> 1, eleStream, nullptr, - false, true, producer, listener); + ASSERT_NO_FATAL_FAILURE(encodeNFrames( + omxNode, observer, kPortIndexInput, kPortIndexOutput, &iBuffer, + &oBuffer, 1024, xFramerate, (nFrameWidth * nFrameHeight * 3) >> 1, + eleStream, nullptr, false, true, producer, listener)); eleStream.close(); - waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, true, - listener); - testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag); + ASSERT_NO_FATAL_FAILURE(waitOnInputConsumption(omxNode, observer, &iBuffer, + &oBuffer, true, listener)); + ASSERT_NO_FATAL_FAILURE( + testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag)); // set state to idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); EXPECT_EQ(portDef.nBufferCountActual, listener->freeBuffers); // set state to executing - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); returnval = producer->disconnect( NATIVE_WINDOW_API_CPU, IGraphicBufferProducer::DisconnectMode::API); @@ -1540,24 +1548,28 @@ TEST_F(VideoEncHidlTest, EncodeTestEOS) { android::Vector<BufferInfo> iBuffer, oBuffer; // set state to idle - changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput, portMode); + ASSERT_NO_FATAL_FAILURE( + changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, + kPortIndexInput, kPortIndexOutput, portMode)); // set state to executing - changeStateIdletoExecute(omxNode, observer); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); // send EOS status = source->signalEndOfInputStream(); ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); - waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, true, - listener); - testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag); + ASSERT_NO_FATAL_FAILURE(waitOnInputConsumption(omxNode, observer, &iBuffer, + &oBuffer, true, listener)); + ASSERT_NO_FATAL_FAILURE( + testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag)); // set state to idle - changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); + ASSERT_NO_FATAL_FAILURE( + changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); EXPECT_EQ(portDef.nBufferCountActual, listener->freeBuffers); // set state to executing - changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, - kPortIndexInput, kPortIndexOutput); + ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, + &oBuffer, kPortIndexInput, + kPortIndexOutput)); returnval = producer->disconnect( NATIVE_WINDOW_API_CPU, IGraphicBufferProducer::DisconnectMode::API); diff --git a/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.cpp b/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.cpp index 91aecf22e..e1b6022f9 100644 --- a/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.cpp +++ b/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.cpp @@ -15,7 +15,6 @@ */ #define LOG_TAG "media_omx_hidl_video_test_common" - #ifdef __LP64__ #define OMX_ANDROID_COMPILE_AS_32BIT_ON_64BIT_PLATFORMS #endif diff --git a/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.h b/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.h index c1d7aeae5..55de12587 100644 --- a/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.h +++ b/media/omx/1.0/vts/functional/video/media_video_hidl_test_common.h @@ -18,14 +18,8 @@ #define MEDIA_VIDEO_HIDL_TEST_COMMON_H /* - * Random Index used for monkey testing while get/set parameters - */ -#define RANDOM_INDEX 1729 - -/* * Common video utils */ - void enumerateProfileAndLevel(sp<IOmxNode> omxNode, OMX_U32 portIndex, std::vector<int32_t>* arrProfile, std::vector<int32_t>* arrLevel); diff --git a/media/res/bbb_aac_stereo_128kbps_48000hz.aac b/media/res/bbb_aac_stereo_128kbps_48000hz.aac Binary files differindex 831102d22..831102d22 100755..100644 --- a/media/res/bbb_aac_stereo_128kbps_48000hz.aac +++ b/media/res/bbb_aac_stereo_128kbps_48000hz.aac diff --git a/media/res/bbb_aac_stereo_128kbps_48000hz.info b/media/res/bbb_aac_stereo_128kbps_48000hz.info index d124f30dd..d124f30dd 100755..100644 --- a/media/res/bbb_aac_stereo_128kbps_48000hz.info +++ b/media/res/bbb_aac_stereo_128kbps_48000hz.info diff --git a/media/res/bbb_amrwb_1ch_14kbps_16000hz.amrwb b/media/res/bbb_amrwb_1ch_14kbps_16000hz.amrwb Binary files differindex 0d8259378..0d8259378 100755..100644 --- a/media/res/bbb_amrwb_1ch_14kbps_16000hz.amrwb +++ b/media/res/bbb_amrwb_1ch_14kbps_16000hz.amrwb diff --git a/media/res/bbb_amrwb_1ch_14kbps_16000hz.info b/media/res/bbb_amrwb_1ch_14kbps_16000hz.info index 71cffefea..71cffefea 100755..100644 --- a/media/res/bbb_amrwb_1ch_14kbps_16000hz.info +++ b/media/res/bbb_amrwb_1ch_14kbps_16000hz.info diff --git a/media/res/bbb_avc_176x144_300kbps_60fps.h264 b/media/res/bbb_avc_176x144_300kbps_60fps.h264 Binary files differnew file mode 100644 index 000000000..da1e75dcd --- /dev/null +++ b/media/res/bbb_avc_176x144_300kbps_60fps.h264 diff --git a/media/res/bbb_avc_176x144_300kbps_60fps.info b/media/res/bbb_avc_176x144_300kbps_60fps.info new file mode 100644 index 000000000..d88b540ef --- /dev/null +++ b/media/res/bbb_avc_176x144_300kbps_60fps.info @@ -0,0 +1,62 @@ +28 128 0 +10 128 0 +4780 32 33333 +960 0 100000 +480 0 66666 +246 0 50000 +264 0 83333 +1160 0 166666 +404 0 133333 +237 0 116666 +193 0 150000 +936 0 233333 +384 0 200000 +199 0 183333 +275 0 216666 +1086 0 300000 +520 0 266666 +301 0 250000 +270 0 283333 +1232 0 366666 +559 0 333333 +287 0 316666 +274 0 350000 +1084 0 433333 +485 0 400000 +307 0 383333 +284 0 416666 +1052 0 500000 +504 0 466666 +298 0 450000 +327 0 483333 +1189 0 566666 +358 0 533333 +172 0 516666 +185 0 550000 +1115 0 633333 +463 0 600000 +218 0 583333 +255 0 616666 +1155 0 700000 +622 0 666666 +356 0 650000 +341 0 683333 +1240 0 766666 +610 0 733333 +341 0 716666 +380 0 750000 +1326 0 833333 +620 0 800000 +396 0 783333 +353 0 816666 +1196 0 900000 +623 0 866666 +375 0 850000 +362 0 883333 +1192 0 966666 +654 0 933333 +359 0 916666 +352 0 950000 +828 0 1016666 +436 0 983333 +401 0 1000000 diff --git a/media/res/bbb_avc_1920x1080_5000kbps_30fps.h264 b/media/res/bbb_avc_1920x1080_5000kbps_30fps.h264 Binary files differdeleted file mode 100644 index cb8f9ebac..000000000 --- a/media/res/bbb_avc_1920x1080_5000kbps_30fps.h264 +++ /dev/null diff --git a/media/res/bbb_avc_1920x1080_5000kbps_30fps.info b/media/res/bbb_avc_1920x1080_5000kbps_30fps.info deleted file mode 100644 index feaf97486..000000000 --- a/media/res/bbb_avc_1920x1080_5000kbps_30fps.info +++ /dev/null @@ -1,242 +0,0 @@ -31 128 0 -8 128 0 -481702 32 0 -137895 0 33333 -81863 0 100000 -98914 0 133333 -6855 0 166666 -2738 0 200000 -1340 0 266666 -1680 0 300000 -2217 0 333333 -3275 0 366666 -3509 0 433333 -4688 0 466666 -4996 0 500000 -6057 0 533333 -7061 0 600000 -7427 0 633333 -7484 0 666666 -8361 0 700000 -7803 0 766666 -8506 0 800000 -8132 0 833333 -8651 0 866666 -8424 0 933333 -8861 0 966666 -9004 0 1000000 -9431 0 1033333 -8854 0 1100000 -9681 0 1133333 -9498 0 1166666 -9694 0 1200000 -17571 0 1266666 -10029 0 1300000 -10022 0 1333333 -9939 0 1366666 -8427 0 1433333 -9522 0 1466666 -7192 0 1500000 -9844 0 1533333 -5693 0 1600000 -8057 0 1633333 -5997 0 1666666 -4028 0 1700000 -2303 0 1766666 -845 0 1800000 -191414 32 1833333 -13266 0 1866666 -16120 0 1933333 -19751 0 1966666 -6559 0 2000000 -8098 0 2033333 -8596 0 2100000 -9331 0 2133333 -9908 0 2166666 -13843 0 2200000 -13776 0 2266666 -14556 0 2300000 -14524 0 2333333 -15089 0 2366666 -14666 0 2433333 -15552 0 2466666 -15020 0 2500000 -16506 0 2533333 -15664 0 2600000 -16499 0 2633333 -16113 0 2666666 -16924 0 2700000 -15948 0 2766666 -17219 0 2800000 -16448 0 2833333 -17729 0 2866666 -16884 0 2933333 -17941 0 2966666 -17215 0 3000000 -18159 0 3033333 -17424 0 3100000 -18479 0 3133333 -17255 0 3166666 -18463 0 3200000 -18723 0 3266666 -19291 0 3300000 -18297 0 3333333 -19633 0 3366666 -18719 0 3433333 -20323 0 3466666 -17035 0 3500000 -19071 0 3533333 -17921 0 3600000 -19198 0 3633333 -18723 0 3666666 -19036 0 3700000 -18735 0 3766666 -19613 0 3800000 -18537 0 3833333 -20868 0 3866666 -16731 0 3933333 -19380 0 3966666 -18409 0 4000000 -19580 0 4033333 -18465 0 4100000 -20104 0 4133333 -16783 0 4166666 -19341 0 4200000 -18674 0 4266666 -19983 0 4300000 -19154 0 4333333 -19750 0 4366666 -19483 0 4433333 -21206 0 4466666 -17608 0 4500000 -20220 0 4533333 -18918 0 4600000 -19494 0 4633333 -19072 0 4666666 -19786 0 4700000 -18540 0 4766666 -19638 0 4800000 -18656 0 4833333 -19453 0 4866666 -19673 0 4933333 -17616 0 4966666 -18317 0 5000000 -18749 0 5033333 -18193 0 5100000 -18732 0 5133333 -18186 0 5166666 -18271 0 5200000 -18256 0 5266666 -16806 0 5300000 -17119 0 5333333 -16466 0 5366666 -15315 0 5433333 -14877 0 5466666 -13235 0 5500000 -13025 0 5533333 -10305 0 5600000 -10120 0 5633333 -7706 0 5666666 -112698 32 5700000 -1544 0 5766666 -1285 0 5800000 -1576 0 5833333 -1714 0 5866666 -1384 0 5933333 -1551 0 5966666 -3916 0 6000000 -8019 0 6033333 -8304 0 6100000 -8416 0 6133333 -8086 0 6166666 -8452 0 6200000 -9205 0 6266666 -11098 0 6300000 -19805 0 6333333 -18292 0 6366666 -14974 0 6433333 -10425 0 6466666 -9997 0 6500000 -8832 0 6533333 -7909 0 6600000 -6400 0 6633333 -5939 0 6666666 -5965 0 6700000 -6221 0 6766666 -6522 0 6800000 -7062 0 6833333 -6877 0 6866666 -6859 0 6933333 -6550 0 6966666 -6127 0 7000000 -5386 0 7033333 -5092 0 7100000 -4370 0 7133333 -4048 0 7166666 -3922 0 7200000 -11453 0 7266666 -16041 0 7300000 -16756 0 7333333 -8616 0 7366666 -9856 0 7433333 -14997 0 7466666 -18365 0 7500000 -21295 0 7533333 -19335 0 7600000 -13689 0 7633333 -14147 0 7666666 -13198 0 7700000 -10999 0 7766666 -7726 0 7800000 -8744 0 7833333 -11321 0 7866666 -14840 0 7933333 -21702 0 7966666 -27091 0 8000000 -28992 0 8033333 -26391 0 8100000 -13809 0 8133333 -11196 0 8166666 -10494 0 8200000 -9921 0 8266666 -7637 0 8300000 -7301 0 8333333 -6890 0 8366666 -9059 0 8433333 -9324 0 8466666 -10277 0 8500000 -10436 0 8533333 -10635 0 8600000 -9554 0 8633333 -8268 0 8666666 -8450 0 8700000 -8430 0 8766666 -8258 0 8800000 -8879 0 8833333 -8050 0 8866666 -7963 0 8933333 -8974 0 8966666 -10037 0 9000000 -8547 0 9033333 -6424 0 9100000 -5672 0 9133333 -6159 0 9166666 -6498 0 9200000 -7064 0 9266666 -6673 0 9300000 -6959 0 9333333 -6226 0 9366666 -6312 0 9433333 -8893 0 9466666 -8253 0 9500000 -5876 0 9533333 -5867 0 9600000 -6212 0 9633333 -6984 0 9666666 -6220 0 9700000 -6993 0 9766666 -15014 0 9800000 -22390 0 9833333 -29552 0 9866666 -24024 0 9933333 -15820 0 9966666 diff --git a/media/res/bbb_avc_640x360_768kbps_30fps.h264 b/media/res/bbb_avc_640x360_768kbps_30fps.h264 Binary files differnew file mode 100755 index 000000000..1d8c68f1c --- /dev/null +++ b/media/res/bbb_avc_640x360_768kbps_30fps.h264 diff --git a/media/res/bbb_avc_640x360_768kbps_30fps.info b/media/res/bbb_avc_640x360_768kbps_30fps.info new file mode 100755 index 000000000..8195c3363 --- /dev/null +++ b/media/res/bbb_avc_640x360_768kbps_30fps.info @@ -0,0 +1,242 @@ +29 128 0 +9 128 0 +38469 32 66666 +3270 0 200000 +443 0 133333 +246 0 100000 +214 0 166666 +2280 0 300000 +368 0 233333 +238 0 266666 +688 0 433333 +287 0 366666 +234 0 333333 +172 0 400000 +1363 0 566666 +273 0 500000 +166 0 466666 +182 0 533333 +3731 0 700000 +349 0 633333 +216 0 600000 +229 0 666666 +6061 0 833333 +408 0 766666 +271 0 733333 +241 0 800000 +7004 0 966666 +442 0 900000 +261 0 866666 +229 0 933333 +7354 0 1100000 +404 0 1033333 +264 0 1000000 +198 0 1066666 +4542 0 1233333 +286 0 1166666 +205 0 1133333 +131 0 1200000 +3329 0 1333333 +216 0 1266666 +136 0 1300000 +2353 0 1366666 +986 0 1400000 +808 0 1433333 +318 0 1466666 +62 0 1500000 +55649 32 1533333 +1606 0 1566666 +2935 0 1600000 +3564 0 1633333 +3324 0 1666666 +4543 0 1700000 +1740 0 1733333 +2737 0 1766666 +2762 0 1800000 +3185 0 1833333 +3238 0 1866666 +3395 0 1900000 +3421 0 1933333 +3482 0 1966666 +3370 0 2000000 +3656 0 2033333 +3509 0 2066666 +3684 0 2100000 +3732 0 2133333 +3366 0 2166666 +3374 0 2200000 +3202 0 2233333 +3449 0 2266666 +3360 0 2300000 +3372 0 2333333 +3460 0 2366666 +3511 0 2400000 +3471 0 2433333 +3330 0 2466666 +3377 0 2500000 +3744 0 2533333 +3667 0 2566666 +3867 0 2600000 +3776 0 2633333 +3329 0 2666666 +3876 0 2700000 +3385 0 2733333 +3566 0 2766666 +3301 0 2800000 +3570 0 2833333 +3132 0 2866666 +3487 0 2900000 +3270 0 2933333 +3472 0 2966666 +3487 0 3000000 +3503 0 3033333 +3443 0 3066666 +3528 0 3100000 +3258 0 3133333 +3707 0 3166666 +3120 0 3200000 +3347 0 3233333 +3372 0 3266666 +3161 0 3300000 +3393 0 3333333 +3399 0 3366666 +2905 0 3400000 +3543 0 3433333 +3103 0 3466666 +3099 0 3500000 +3457 0 3533333 +3191 0 3566666 +3290 0 3600000 +3312 0 3633333 +2955 0 3666666 +3341 0 3700000 +3102 0 3733333 +3186 0 3766666 +3180 0 3800000 +2839 0 3833333 +3089 0 3866666 +3110 0 3900000 +3165 0 3933333 +2684 0 3966666 +3082 0 4000000 +2694 0 4033333 +3051 0 4066666 +3002 0 4100000 +2929 0 4133333 +2676 0 4166666 +2411 0 4200000 +2874 0 4233333 +2572 0 4266666 +2420 0 4300000 +2500 0 4333333 +2137 0 4366666 +2344 0 4400000 +2028 0 4433333 +1754 0 4466666 +1627 0 4500000 +1375 0 4533333 +1069 0 4566666 +801 0 4600000 +21689 32 4633333 +261 0 4733333 +76 0 4666666 +45 0 4700000 +334 0 4800000 +61 0 4766666 +1577 0 4933333 +280 0 4866666 +72 0 4833333 +479 0 4900000 +2181 0 5066666 +919 0 5000000 +349 0 4966666 +534 0 5033333 +4860 0 5166666 +759 0 5100000 +677 0 5133333 +3101 0 5300000 +498 0 5233333 +327 0 5200000 +213 0 5266666 +1640 0 5433333 +259 0 5366666 +162 0 5333333 +148 0 5400000 +2130 0 5566666 +397 0 5500000 +191 0 5466666 +180 0 5533333 +1757 0 5700000 +338 0 5633333 +194 0 5600000 +141 0 5666666 +1103 0 5833333 +289 0 5766666 +149 0 5733333 +148 0 5800000 +3914 0 5966666 +1025 0 5900000 +714 0 5866666 +428 0 5933333 +4604 0 6100000 +1456 0 6033333 +699 0 6000000 +892 0 6066666 +4535 0 6233333 +1301 0 6166666 +708 0 6133333 +592 0 6200000 +2175 0 6333333 +603 0 6266666 +411 0 6300000 +1813 0 6366666 +5055 0 6466666 +1538 0 6400000 +2201 0 6433333 +6249 0 6533333 +1420 0 6500000 +2254 0 6566666 +2441 0 6633333 +293 0 6600000 +2062 0 6700000 +213 0 6666666 +2455 0 6800000 +344 0 6733333 +204 0 6766666 +3920 0 6933333 +751 0 6866666 +376 0 6833333 +337 0 6900000 +2882 0 7066666 +457 0 7000000 +222 0 6966666 +184 0 7033333 +2734 0 7200000 +472 0 7133333 +185 0 7100000 +250 0 7166666 +2735 0 7333333 +301 0 7266666 +307 0 7233333 +109 0 7300000 +1852 0 7466666 +322 0 7400000 +153 0 7366666 +195 0 7433333 +1506 0 7600000 +350 0 7533333 +170 0 7500000 +145 0 7566666 +2123 0 7733333 +430 0 7666666 +364 0 7633333 +190 0 7700000 +1296 0 7800000 +196 0 7766666 +858 0 7833333 +3865 0 7933333 +693 0 7866666 +1606 0 7900000 +4884 0 7966666 +2821 0 8033333 +2211 0 8000000 diff --git a/media/res/bbb_flac_stereo_680kbps_48000hz.flac b/media/res/bbb_flac_stereo_680kbps_48000hz.flac Binary files differnew file mode 100644 index 000000000..db94d8eb0 --- /dev/null +++ b/media/res/bbb_flac_stereo_680kbps_48000hz.flac diff --git a/media/res/bbb_flac_stereo_680kbps_48000hz.info b/media/res/bbb_flac_stereo_680kbps_48000hz.info new file mode 100644 index 000000000..c57243079 --- /dev/null +++ b/media/res/bbb_flac_stereo_680kbps_48000hz.info @@ -0,0 +1,415 @@ +42 128 0 +1386 32 0 +2401 32 24000 +2321 32 48000 +2367 32 72000 +2370 32 96000 +2334 32 120000 +2396 32 144000 +2375 32 168000 +2431 32 192000 +2428 32 216000 +2334 32 240000 +2261 32 264000 +2124 32 288000 +2152 32 312000 +2295 32 336000 +2183 32 360000 +2393 32 384000 +2400 32 408000 +2246 32 432000 +2289 32 456000 +2400 32 480000 +2335 32 504000 +2294 32 528000 +2260 32 552000 +2206 32 576000 +2185 32 600000 +2155 32 624000 +2118 32 648000 +2094 32 672000 +2050 32 696000 +2059 32 720000 +2030 32 744000 +2022 32 768000 +2078 32 792000 +2082 32 816000 +2094 32 840000 +2111 32 864000 +2043 32 888000 +2023 32 912000 +2024 32 936000 +2056 32 960000 +2108 32 984000 +2138 32 1008000 +2140 32 1032000 +2111 32 1056000 +2110 32 1080000 +2137 32 1104000 +2157 32 1128000 +2174 32 1152000 +2200 32 1176000 +2203 32 1200000 +2237 32 1224000 +2261 32 1248000 +2215 32 1272000 +2133 32 1296000 +2091 32 1320000 +2088 32 1344000 +2122 32 1368000 +2139 32 1392000 +2146 32 1416000 +2231 32 1440000 +2282 32 1464000 +2273 32 1488000 +2304 32 1512000 +2292 32 1536000 +2255 32 1560000 +2181 32 1584000 +2081 32 1608000 +2012 32 1632000 +2011 32 1656000 +2066 32 1680000 +2069 32 1704000 +2120 32 1728000 +2141 32 1752000 +2148 32 1776000 +2181 32 1800000 +2176 32 1824000 +2240 32 1848000 +2297 32 1872000 +2325 32 1896000 +2336 32 1920000 +2329 32 1944000 +2299 32 1968000 +2322 32 1992000 +2347 32 2016000 +2287 32 2040000 +2286 32 2064000 +2269 32 2088000 +2320 32 2112000 +2305 32 2136000 +2384 32 2160000 +2429 32 2184000 +2370 32 2208000 +2365 32 2232000 +2361 32 2256000 +2370 32 2280000 +2393 32 2304000 +2342 32 2328000 +2325 32 2352000 +2334 32 2376000 +2316 32 2400000 +2317 32 2424000 +2305 32 2448000 +2360 32 2472000 +2331 32 2496000 +2332 32 2520000 +2361 32 2544000 +2417 32 2568000 +2438 32 2592000 +2403 32 2616000 +2386 32 2640000 +2382 32 2664000 +2350 32 2688000 +2355 32 2712000 +2383 32 2736000 +2384 32 2760000 +2383 32 2784000 +2373 32 2808000 +2374 32 2832000 +2347 32 2856000 +2353 32 2880000 +2381 32 2904000 +2401 32 2928000 +2401 32 2952000 +2385 32 2976000 +2382 32 3000000 +2328 32 3024000 +2303 32 3048000 +2272 32 3072000 +2270 32 3096000 +2312 32 3120000 +2273 32 3144000 +2330 32 3168000 +2339 32 3192000 +2296 32 3216000 +2317 32 3240000 +2440 32 3264000 +2353 32 3288000 +2346 32 3312000 +2303 32 3336000 +2308 32 3360000 +2287 32 3384000 +2316 32 3408000 +2367 32 3432000 +2335 32 3456000 +2350 32 3480000 +2395 32 3504000 +2408 32 3528000 +2413 32 3552000 +2415 32 3576000 +2468 32 3600000 +2437 32 3624000 +2372 32 3648000 +2371 32 3672000 +2341 32 3696000 +2328 32 3720000 +2273 32 3744000 +2244 32 3768000 +2233 32 3792000 +2229 32 3816000 +2252 32 3840000 +2236 32 3864000 +2217 32 3888000 +2179 32 3912000 +2251 32 3936000 +2192 32 3960000 +2199 32 3984000 +2212 32 4008000 +2190 32 4032000 +2102 32 4056000 +2120 32 4080000 +2167 32 4104000 +2024 32 4128000 +2010 32 4152000 +2067 32 4176000 +2035 32 4200000 +2051 32 4224000 +2012 32 4248000 +2066 32 4272000 +2025 32 4296000 +1987 32 4320000 +1972 32 4344000 +1966 32 4368000 +1999 32 4392000 +1987 32 4416000 +1922 32 4440000 +2020 32 4464000 +2072 32 4488000 +2021 32 4512000 +2017 32 4536000 +2099 32 4560000 +2064 32 4584000 +2109 32 4608000 +2093 32 4632000 +2090 32 4656000 +2148 32 4680000 +2184 32 4704000 +2179 32 4728000 +2152 32 4752000 +2143 32 4776000 +2159 32 4800000 +2123 32 4824000 +2129 32 4848000 +2147 32 4872000 +2192 32 4896000 +2051 32 4920000 +2116 32 4944000 +2124 32 4968000 +2088 32 4992000 +2073 32 5016000 +2146 32 5040000 +2133 32 5064000 +2073 32 5088000 +2059 32 5112000 +2044 32 5136000 +2012 32 5160000 +2034 32 5184000 +2053 32 5208000 +2013 32 5232000 +1981 32 5256000 +2094 32 5280000 +2076 32 5304000 +1968 32 5328000 +2028 32 5352000 +2031 32 5376000 +2020 32 5400000 +2019 32 5424000 +2030 32 5448000 +2015 32 5472000 +1962 32 5496000 +2070 32 5520000 +2087 32 5544000 +1964 32 5568000 +2069 32 5592000 +2034 32 5616000 +1994 32 5640000 +1985 32 5664000 +2030 32 5688000 +2066 32 5712000 +1954 32 5736000 +1733 32 5760000 +1649 32 5784000 +1652 32 5808000 +1631 32 5832000 +1656 32 5856000 +1672 32 5880000 +1667 32 5904000 +1696 32 5928000 +1672 32 5952000 +1701 32 5976000 +1651 32 6000000 +1674 32 6024000 +1695 32 6048000 +1702 32 6072000 +1707 32 6096000 +1694 32 6120000 +1727 32 6144000 +1730 32 6168000 +1708 32 6192000 +1704 32 6216000 +1735 32 6240000 +1758 32 6264000 +1753 32 6288000 +1748 32 6312000 +1763 32 6336000 +1737 32 6360000 +1783 32 6384000 +1839 32 6408000 +1861 32 6432000 +1832 32 6456000 +1947 32 6480000 +1939 32 6504000 +1926 32 6528000 +1896 32 6552000 +1909 32 6576000 +1869 32 6600000 +1900 32 6624000 +1896 32 6648000 +1883 32 6672000 +1903 32 6696000 +1895 32 6720000 +1865 32 6744000 +1878 32 6768000 +1881 32 6792000 +1861 32 6816000 +1791 32 6840000 +1787 32 6864000 +1798 32 6888000 +1811 32 6912000 +1824 32 6936000 +1895 32 6960000 +2079 32 6984000 +2034 32 7008000 +2038 32 7032000 +2018 32 7056000 +2030 32 7080000 +2067 32 7104000 +1982 32 7128000 +1911 32 7152000 +1904 32 7176000 +1874 32 7200000 +1876 32 7224000 +1944 32 7248000 +1977 32 7272000 +1977 32 7296000 +1979 32 7320000 +2012 32 7344000 +1961 32 7368000 +1773 32 7392000 +1780 32 7416000 +1801 32 7440000 +1892 32 7464000 +1869 32 7488000 +1936 32 7512000 +2154 32 7536000 +2226 32 7560000 +2159 32 7584000 +2253 32 7608000 +2286 32 7632000 +2214 32 7656000 +2111 32 7680000 +2027 32 7704000 +1994 32 7728000 +1882 32 7752000 +1887 32 7776000 +1993 32 7800000 +1962 32 7824000 +1982 32 7848000 +1966 32 7872000 +1962 32 7896000 +1928 32 7920000 +1878 32 7944000 +1857 32 7968000 +1885 32 7992000 +1919 32 8016000 +1904 32 8040000 +1909 32 8064000 +1909 32 8088000 +1933 32 8112000 +1824 32 8136000 +1756 32 8160000 +1733 32 8184000 +1705 32 8208000 +1755 32 8232000 +1756 32 8256000 +1725 32 8280000 +1761 32 8304000 +1736 32 8328000 +1706 32 8352000 +1662 32 8376000 +1604 32 8400000 +1613 32 8424000 +1692 32 8448000 +1736 32 8472000 +1779 32 8496000 +1768 32 8520000 +1758 32 8544000 +1708 32 8568000 +1642 32 8592000 +1645 32 8616000 +1581 32 8640000 +1651 32 8664000 +1731 32 8688000 +1743 32 8712000 +1717 32 8736000 +1715 32 8760000 +1646 32 8784000 +1551 32 8808000 +1563 32 8832000 +1649 32 8856000 +1742 32 8880000 +1724 32 8904000 +1676 32 8928000 +1664 32 8952000 +1587 32 8976000 +1497 32 9000000 +1503 32 9024000 +1644 32 9048000 +1658 32 9072000 +1680 32 9096000 +1611 32 9120000 +1694 32 9144000 +1668 32 9168000 +1677 32 9192000 +1604 32 9216000 +1567 32 9240000 +1639 32 9264000 +1552 32 9288000 +1486 32 9312000 +1494 32 9336000 +1480 32 9360000 +1509 32 9384000 +1457 32 9408000 +1423 32 9432000 +1459 32 9456000 +1444 32 9480000 +1424 32 9504000 +1413 32 9528000 +1498 32 9552000 +1455 32 9576000 +1393 32 9600000 +1638 32 9624000 +1919 32 9648000 +1979 32 9672000 +1894 32 9696000 +2002 32 9720000 +2062 32 9744000 +2098 32 9768000 +1919 32 9792000 +1738 32 9816000 +1890 32 9840000 +1971 32 9864000 +2429 32 9888000 +1861 32 9912000 diff --git a/media/res/bbb_g711alaw_1ch_8khz.info b/media/res/bbb_g711alaw_1ch_8khz.info index 2ffe358eb..2ffe358eb 100755..100644 --- a/media/res/bbb_g711alaw_1ch_8khz.info +++ b/media/res/bbb_g711alaw_1ch_8khz.info diff --git a/media/res/bbb_g711alaw_1ch_8khz.raw b/media/res/bbb_g711alaw_1ch_8khz.raw index cfc4a11cf..cfc4a11cf 100755..100644 --- a/media/res/bbb_g711alaw_1ch_8khz.raw +++ b/media/res/bbb_g711alaw_1ch_8khz.raw diff --git a/media/res/bbb_g711mulaw_1ch_8khz.info b/media/res/bbb_g711mulaw_1ch_8khz.info index 5162a17f0..5162a17f0 100755..100644 --- a/media/res/bbb_g711mulaw_1ch_8khz.info +++ b/media/res/bbb_g711mulaw_1ch_8khz.info diff --git a/media/res/bbb_g711mulaw_1ch_8khz.raw b/media/res/bbb_g711mulaw_1ch_8khz.raw index f38f1cae6..f38f1cae6 100755..100644 --- a/media/res/bbb_g711mulaw_1ch_8khz.raw +++ b/media/res/bbb_g711mulaw_1ch_8khz.raw diff --git a/media/res/bbb_gsm_1ch_8khz_13kbps.info b/media/res/bbb_gsm_1ch_8khz_13kbps.info index b15b296a2..b15b296a2 100755..100644 --- a/media/res/bbb_gsm_1ch_8khz_13kbps.info +++ b/media/res/bbb_gsm_1ch_8khz_13kbps.info diff --git a/media/res/bbb_gsm_1ch_8khz_13kbps.raw b/media/res/bbb_gsm_1ch_8khz_13kbps.raw Binary files differindex df903a8d6..df903a8d6 100755..100644 --- a/media/res/bbb_gsm_1ch_8khz_13kbps.raw +++ b/media/res/bbb_gsm_1ch_8khz_13kbps.raw diff --git a/media/res/bbb_hevc_176x144_176kbps_60fps.hevc b/media/res/bbb_hevc_176x144_176kbps_60fps.hevc Binary files differnew file mode 100644 index 000000000..f82236f3a --- /dev/null +++ b/media/res/bbb_hevc_176x144_176kbps_60fps.hevc diff --git a/media/res/bbb_hevc_176x144_176kbps_60fps.info b/media/res/bbb_hevc_176x144_176kbps_60fps.info new file mode 100644 index 000000000..702b85369 --- /dev/null +++ b/media/res/bbb_hevc_176x144_176kbps_60fps.info @@ -0,0 +1,61 @@ +1695 128 0 +1938 32 33333 +471 0 83333 +153 0 66666 +99 0 50000 +657 0 150000 +260 0 116666 +115 0 100000 +99 0 133333 +622 0 216666 +211 0 183333 +79 0 166666 +95 0 200000 +597 0 283333 +288 0 250000 +145 0 233333 +147 0 266666 +676 0 350000 +284 0 316666 +144 0 300000 +131 0 333333 +658 0 416666 +270 0 383333 +101 0 366666 +151 0 400000 +529 0 483333 +257 0 450000 +98 0 433333 +160 0 466666 +664 0 566666 +186 0 533333 +147 0 500000 +67 0 516666 +78 0 550000 +575 0 633333 +230 0 600000 +134 0 583333 +114 0 616666 +629 0 700000 +224 0 666666 +138 0 650000 +129 0 683333 +645 0 750000 +264 0 733333 +145 0 716666 +705 0 816666 +365 0 783333 +156 0 766666 +160 0 800000 +725 0 883333 +330 0 850000 +138 0 833333 +162 0 866666 +638 0 950000 +337 0 916666 +170 0 900000 +133 0 933333 +432 0 1016666 +287 0 983333 +130 0 966666 +136 0 1000000 diff --git a/media/res/bbb_mpeg2_352x288_1mbps_60fps.info b/media/res/bbb_mpeg2_352x288_1mbps_60fps.info new file mode 100644 index 000000000..d5290d70d --- /dev/null +++ b/media/res/bbb_mpeg2_352x288_1mbps_60fps.info @@ -0,0 +1,60 @@ +16680 32 16666 +17017 0 33333 +10534 0 50000 +10289 0 66666 +3698 0 83333 +2776 0 100000 +1936 0 116666 +1493 0 133333 +1217 0 150000 +993 0 166666 +805 0 183333 +857 0 200000 +5082 32 216666 +812 0 233333 +718 0 250000 +746 0 266666 +762 0 283333 +865 0 300000 +782 0 316666 +833 0 333333 +750 0 350000 +819 0 366666 +826 0 383333 +846 0 400000 +4522 32 416666 +678 0 433333 +718 0 450000 +803 0 466666 +769 0 483333 +762 0 500000 +587 0 516666 +635 0 533333 +658 0 550000 +714 0 566666 +677 0 583333 +699 0 600000 +4616 32 616666 +800 0 633333 +831 0 650000 +928 0 666666 +869 0 683333 +931 0 700000 +930 0 716666 +974 0 733333 +978 0 750000 +932 0 766666 +918 0 783333 +978 0 800000 +4655 32 816666 +897 0 833333 +896 0 850000 +883 0 866666 +949 0 883333 +965 0 900000 +951 0 916666 +901 0 933333 +965 0 950000 +955 0 966666 +948 0 983333 +968 0 1000000 diff --git a/media/res/bbb_mpeg2_352x288_1mbps_60fps.m2v b/media/res/bbb_mpeg2_352x288_1mbps_60fps.m2v Binary files differnew file mode 100644 index 000000000..2f67c2b38 --- /dev/null +++ b/media/res/bbb_mpeg2_352x288_1mbps_60fps.m2v diff --git a/media/res/bbb_mpeg4_1280x720_1000kbps_25fps.info b/media/res/bbb_mpeg4_1280x720_1000kbps_25fps.info deleted file mode 100644 index b05a44c83..000000000 --- a/media/res/bbb_mpeg4_1280x720_1000kbps_25fps.info +++ /dev/null @@ -1,251 +0,0 @@ -49 128 0 -49 128 0 -57542 32 0 -50961 0 40000 -29136 0 80000 -28146 0 120000 -25472 0 160000 -5752 0 200000 -4373 0 240000 -4261 0 280000 -5083 0 320000 -6504 0 360000 -5080 0 400000 -5688 0 440000 -50834 32 480000 -4559 0 520000 -4118 0 560000 -3937 0 600000 -4262 0 640000 -4649 0 680000 -3995 0 720000 -3899 0 760000 -3896 0 800000 -3998 0 840000 -4129 0 880000 -4064 0 920000 -42872 32 960000 -3265 0 1000000 -2506 0 1040000 -2178 0 1080000 -2445 0 1120000 -2461 0 1160000 -3267 0 1200000 -2700 0 1240000 -2924 0 1280000 -2405 0 1320000 -2656 0 1360000 -2494 0 1400000 -47454 32 1440000 -2956 0 1480000 -1434 0 1520000 -707 0 1560000 -1310 0 1600000 -1791 0 1640000 -2088 0 1680000 -1078 0 1720000 -738 0 1760000 -74837 32 1800000 -3304 0 1840000 -3656 0 1880000 -2822 0 1920000 -2566 0 1960000 -2816 0 2000000 -2590 0 2040000 -2471 0 2080000 -2553 0 2120000 -2547 0 2160000 -2628 0 2200000 -2664 0 2240000 -38161 32 2280000 -2995 0 2320000 -2205 0 2360000 -2055 0 2400000 -2122 0 2440000 -2236 0 2480000 -2407 0 2520000 -893 0 2560000 -2511 0 2600000 -2703 0 2640000 -2511 0 2680000 -2564 0 2720000 -35944 32 2760000 -3002 0 2800000 -2188 0 2840000 -2109 0 2880000 -2058 0 2920000 -2242 0 2960000 -2240 0 3000000 -2346 0 3040000 -2223 0 3080000 -2430 0 3120000 -2486 0 3160000 -2379 0 3200000 -34014 32 3240000 -3009 0 3280000 -2073 0 3320000 -2005 0 3360000 -2052 0 3400000 -2167 0 3440000 -2331 0 3480000 -2201 0 3520000 -896 0 3560000 -2594 0 3600000 -2589 0 3640000 -2542 0 3680000 -33973 32 3720000 -2913 0 3760000 -1978 0 3800000 -1943 0 3840000 -1983 0 3880000 -2234 0 3920000 -2142 0 3960000 -2106 0 4000000 -2253 0 4040000 -2327 0 4080000 -2186 0 4120000 -2366 0 4160000 -32094 32 4200000 -3050 0 4240000 -1913 0 4280000 -2016 0 4320000 -2097 0 4360000 -2112 0 4400000 -2163 0 4440000 -2258 0 4480000 -2231 0 4520000 -882 0 4560000 -2575 0 4600000 -2700 0 4640000 -33754 32 4680000 -3011 0 4720000 -2034 0 4760000 -1986 0 4800000 -1983 0 4840000 -2180 0 4880000 -2067 0 4920000 -2262 0 4960000 -2323 0 5000000 -2367 0 5040000 -2289 0 5080000 -2263 0 5120000 -31806 32 5160000 -3285 0 5200000 -1957 0 5240000 -2073 0 5280000 -2057 0 5320000 -2134 0 5360000 -2086 0 5400000 -2217 0 5440000 -2314 0 5480000 -2176 0 5520000 -852 0 5560000 -2421 0 5600000 -37236 32 5640000 -16140 32 5680000 -3491 0 5720000 -2891 0 5760000 -1499 0 5800000 -659 0 5840000 -652 0 5880000 -648 0 5920000 -1892 0 5960000 -3050 0 6000000 -2235 0 6040000 -1925 0 6080000 -1790 0 6120000 -16441 32 6160000 -5341 0 6200000 -2445 0 6240000 -2878 0 6280000 -2366 0 6320000 -1732 0 6360000 -1858 0 6400000 -1632 0 6440000 -1514 0 6480000 -1874 0 6520000 -1059 0 6560000 -1795 0 6600000 -20153 32 6640000 -3589 0 6680000 -2418 0 6720000 -1896 0 6760000 -1577 0 6800000 -1629 0 6840000 -1717 0 6880000 -1717 0 6920000 -1815 0 6960000 -1663 0 7000000 -1855 0 7040000 -1699 0 7080000 -21184 32 7120000 -3395 0 7160000 -3276 0 7200000 -3825 0 7240000 -2747 0 7280000 -1684 0 7320000 -2141 0 7360000 -2372 0 7400000 -2777 0 7440000 -2828 0 7480000 -2442 0 7520000 -1302 0 7560000 -20702 32 7600000 -4043 0 7640000 -2875 0 7680000 -2026 0 7720000 -1983 0 7760000 -2173 0 7800000 -2670 0 7840000 -3145 0 7880000 -5312 0 7920000 -5547 0 7960000 -4262 0 8000000 -2637 0 8040000 -15761 32 8080000 -2693 0 8120000 -1433 0 8160000 -2108 0 8200000 -2253 0 8240000 -1846 0 8280000 -1281 0 8320000 -2294 0 8360000 -2217 0 8400000 -2370 0 8440000 -1809 0 8480000 -1899 0 8520000 -21630 32 8560000 -3189 0 8600000 -1679 0 8640000 -1732 0 8680000 -1672 0 8720000 -1788 0 8760000 -1656 0 8800000 -1765 0 8840000 -1579 0 8880000 -2142 0 8920000 -1954 0 8960000 -1854 0 9000000 -24966 32 9040000 -2176 0 9080000 -1236 0 9120000 -1282 0 9160000 -1526 0 9200000 -1369 0 9240000 -1283 0 9280000 -1434 0 9320000 -1335 0 9360000 -2144 0 9400000 -1917 0 9440000 -1409 0 9480000 -27745 32 9520000 -1905 0 9560000 -1495 0 9600000 -1685 0 9640000 -1745 0 9680000 -1894 0 9720000 -3667 0 9760000 -5546 0 9800000 -5729 0 9840000 -4479 0 9880000 -3829 0 9920000 diff --git a/media/res/bbb_mpeg4_1280x720_1000kbps_25fps.m4v b/media/res/bbb_mpeg4_1280x720_1000kbps_25fps.m4v Binary files differdeleted file mode 100644 index ec32d5ed5..000000000 --- a/media/res/bbb_mpeg4_1280x720_1000kbps_25fps.m4v +++ /dev/null diff --git a/media/res/bbb_mpeg4_352x288_512kbps_30fps.info b/media/res/bbb_mpeg4_352x288_512kbps_30fps.info new file mode 100755 index 000000000..326a3e184 --- /dev/null +++ b/media/res/bbb_mpeg4_352x288_512kbps_30fps.info @@ -0,0 +1,241 @@ +47 128 0 +21115 32 0 +16456 0 33333 +11880 0 66666 +12155 0 100000 +11402 0 133333 +5345 0 166666 +2986 0 200000 +1924 0 233333 +2275 0 266666 +2793 0 300000 +2756 0 333333 +2933 0 366666 +21100 32 400000 +1302 0 433333 +2206 0 466666 +1599 0 500000 +2558 0 533333 +2784 0 566666 +2458 0 600000 +2480 0 633333 +1446 0 666666 +3109 0 700000 +944 0 733333 +3134 0 766666 +21342 32 800000 +652 0 833333 +1708 0 866666 +2202 0 900000 +1695 0 933333 +1661 0 966666 +1652 0 1000000 +1679 0 1033333 +1690 0 1066666 +1824 0 1100000 +1803 0 1133333 +1598 0 1166666 +21540 32 1200000 +205 0 1233333 +1124 0 1266666 +1069 0 1300000 +838 0 1333333 +765 0 1366666 +4265 0 1400000 +94 0 1433333 +20463 0 1466666 +1028 0 1500000 +1475 0 1533333 +3630 0 1566666 +28373 32 1600000 +725 0 1633333 +1119 0 1666666 +1427 0 1700000 +1679 0 1733333 +1866 0 1766666 +1197 0 1800000 +1572 0 1833333 +1651 0 1866666 +1678 0 1900000 +1688 0 1933333 +1659 0 1966666 +19900 32 2000000 +584 0 2033333 +1475 0 2066666 +1678 0 2100000 +1010 0 2133333 +1435 0 2166666 +1612 0 2200000 +1602 0 2233333 +1709 0 2266666 +1737 0 2300000 +1835 0 2333333 +926 0 2366666 +20090 32 2400000 +631 0 2433333 +1576 0 2466666 +941 0 2500000 +2349 0 2533333 +1112 0 2566666 +1566 0 2600000 +1773 0 2633333 +979 0 2666666 +2246 0 2700000 +904 0 2733333 +1342 0 2766666 +20147 32 2800000 +630 0 2833333 +982 0 2866666 +2089 0 2900000 +1021 0 2933333 +1506 0 2966666 +1642 0 3000000 +968 0 3033333 +1262 0 3066666 +2270 0 3100000 +864 0 3133333 +1252 0 3166666 +20145 32 3200000 +595 0 3233333 +918 0 3266666 +1167 0 3300000 +1347 0 3333333 +1597 0 3366666 +1636 0 3400000 +944 0 3433333 +1295 0 3466666 +1397 0 3500000 +1413 0 3533333 +1432 0 3566666 +20180 32 3600000 +525 0 3633333 +1068 0 3666666 +1230 0 3700000 +1428 0 3733333 +916 0 3766666 +1948 0 3800000 +966 0 3833333 +1342 0 3866666 +1338 0 3900000 +1379 0 3933333 +1296 0 3966666 +17378 32 4000000 +583 0 4033333 +936 0 4066666 +1745 0 4100000 +987 0 4133333 +1393 0 4166666 +1495 0 4200000 +869 0 4233333 +1938 0 4266666 +828 0 4300000 +1851 0 4333333 +834 0 4366666 +17280 32 4400000 +580 0 4433333 +869 0 4466666 +1605 0 4500000 +843 0 4533333 +6147 32 4566666 +220 0 4600000 +1106 0 4633333 +395 0 4666666 +304 0 4700000 +1946 0 4733333 +154 0 4766666 +482 0 4800000 +949 0 4833333 +1088 0 4866666 +974 0 4900000 +876 0 4933333 +9164 32 4966666 +1019 0 5000000 +983 0 5033333 +1375 0 5066666 +1041 0 5100000 +789 0 5133333 +1037 0 5166666 +812 0 5200000 +732 0 5233333 +972 0 5266666 +708 0 5300000 +623 0 5333333 +10667 32 5366666 +463 0 5400000 +911 0 5433333 +861 0 5466666 +507 0 5500000 +1015 0 5533333 +501 0 5566666 +934 0 5600000 +812 0 5633333 +855 0 5666666 +804 0 5700000 +783 0 5733333 +10610 32 5766666 +950 0 5800000 +1292 0 5833333 +1002 0 5866666 +728 0 5900000 +960 0 5933333 +1230 0 5966666 +1315 0 6000000 +1248 0 6033333 +995 0 6066666 +1401 0 6100000 +905 0 6133333 +9326 32 6166666 +726 0 6200000 +667 0 6233333 +833 0 6266666 +1007 0 6300000 +1172 0 6333333 +1910 0 6366666 +1954 0 6400000 +1498 0 6433333 +1188 0 6466666 +784 0 6500000 +1005 0 6533333 +10030 32 6566666 +452 0 6600000 +763 0 6633333 +639 0 6666666 +671 0 6700000 +867 0 6733333 +963 0 6766666 +982 0 6800000 +995 0 6833333 +982 0 6866666 +747 0 6900000 +574 0 6933333 +12353 32 6966666 +474 0 7000000 +969 0 7033333 +633 0 7066666 +723 0 7100000 +1221 0 7133333 +674 0 7166666 +776 0 7200000 +572 0 7233333 +912 0 7266666 +564 0 7300000 +594 0 7333333 +16661 32 7366666 +518 0 7400000 +656 0 7433333 +625 0 7466666 +583 0 7500000 +584 0 7533333 +1027 0 7566666 +812 0 7600000 +729 0 7633333 +766 0 7666666 +901 0 7700000 +960 0 7733333 +12336 32 7766666 +944 0 7800000 +1398 0 7833333 +1625 0 7866666 +2103 0 7900000 +1630 0 7933333 +1228 0 7966666 diff --git a/media/res/bbb_mpeg4_352x288_512kbps_30fps.m4v b/media/res/bbb_mpeg4_352x288_512kbps_30fps.m4v Binary files differnew file mode 100755 index 000000000..b7ead0092 --- /dev/null +++ b/media/res/bbb_mpeg4_352x288_512kbps_30fps.m4v diff --git a/media/res/bbb_opus_stereo_128kbps_48000hz.info b/media/res/bbb_opus_stereo_128kbps_48000hz.info index 12a6b9965..12a6b9965 100755..100644 --- a/media/res/bbb_opus_stereo_128kbps_48000hz.info +++ b/media/res/bbb_opus_stereo_128kbps_48000hz.info diff --git a/media/res/bbb_opus_stereo_128kbps_48000hz.opus b/media/res/bbb_opus_stereo_128kbps_48000hz.opus Binary files differindex 7b763b2c1..7b763b2c1 100755..100644 --- a/media/res/bbb_opus_stereo_128kbps_48000hz.opus +++ b/media/res/bbb_opus_stereo_128kbps_48000hz.opus diff --git a/media/res/bbb_raw_1ch_8khz_s32le.info b/media/res/bbb_raw_1ch_8khz_s32le.info index 933925bea..933925bea 100755..100644 --- a/media/res/bbb_raw_1ch_8khz_s32le.info +++ b/media/res/bbb_raw_1ch_8khz_s32le.info diff --git a/media/res/bbb_raw_1ch_8khz_s32le.raw b/media/res/bbb_raw_1ch_8khz_s32le.raw Binary files differindex fd91b4621..fd91b4621 100755..100644 --- a/media/res/bbb_raw_1ch_8khz_s32le.raw +++ b/media/res/bbb_raw_1ch_8khz_s32le.raw diff --git a/media/res/bbb_vorbis_stereo_128kbps_48000hz.info b/media/res/bbb_vorbis_stereo_128kbps_48000hz.info index 0716643c5..0716643c5 100755..100644 --- a/media/res/bbb_vorbis_stereo_128kbps_48000hz.info +++ b/media/res/bbb_vorbis_stereo_128kbps_48000hz.info diff --git a/media/res/bbb_vorbis_stereo_128kbps_48000hz.vorbis b/media/res/bbb_vorbis_stereo_128kbps_48000hz.vorbis Binary files differindex 404c5f815..404c5f815 100755..100644 --- a/media/res/bbb_vorbis_stereo_128kbps_48000hz.vorbis +++ b/media/res/bbb_vorbis_stereo_128kbps_48000hz.vorbis diff --git a/media/res/bbb_vp8_176x144_240kbps_60fps.info b/media/res/bbb_vp8_176x144_240kbps_60fps.info new file mode 100644 index 000000000..559f42580 --- /dev/null +++ b/media/res/bbb_vp8_176x144_240kbps_60fps.info @@ -0,0 +1,60 @@ +10271 32 0 +106 0 17000 +134 0 33000 +149 0 50000 +152 0 67000 +159 0 83000 +114 0 100000 +723 0 117000 +175 0 133000 +186 0 150000 +201 0 167000 +270 0 183000 +383 0 200000 +255 0 217000 +286 0 233000 +273 0 250000 +1224 0 267000 +220 0 283000 +231 0 300000 +192 0 317000 +182 0 333000 +289 0 350000 +204 0 367000 +237 0 383000 +187 0 400000 +898 0 417000 +231 0 433000 +266 0 450000 +278 0 467000 +205 0 483000 +255 0 500000 +169 0 517000 +233 0 533000 +1011 0 550000 +202 0 567000 +251 0 583000 +223 0 600000 +283 0 617000 +362 0 633000 +217 0 650000 +245 0 667000 +960 0 683000 +233 0 700000 +286 0 717000 +272 0 733000 +254 0 750000 +331 0 767000 +218 0 783000 +261 0 800000 +981 0 817000 +226 0 833000 +226 0 850000 +279 0 867000 +225 0 883000 +295 0 900000 +175 0 917000 +249 0 933000 +996 0 950000 +169 0 967000 +224 0 983000 diff --git a/media/res/bbb_vp8_176x144_240kbps_60fps.vp8 b/media/res/bbb_vp8_176x144_240kbps_60fps.vp8 Binary files differnew file mode 100644 index 000000000..6eba56cca --- /dev/null +++ b/media/res/bbb_vp8_176x144_240kbps_60fps.vp8 diff --git a/media/res/bbb_vp9_176x144_285kbps_60fps.info b/media/res/bbb_vp9_176x144_285kbps_60fps.info new file mode 100644 index 000000000..2f7d35bed --- /dev/null +++ b/media/res/bbb_vp9_176x144_285kbps_60fps.info @@ -0,0 +1,60 @@ +6939 32 0 +6818 0 17000 +310 0 33000 +273 0 50000 +267 0 67000 +239 0 83000 +232 0 100000 +222 0 117000 +186 0 133000 +194 0 150000 +189 0 167000 +18 0 183000 +2014 0 200000 +297 0 217000 +287 0 233000 +237 0 250000 +263 0 267000 +238 0 283000 +257 0 300000 +229 0 317000 +187 0 333000 +191 0 350000 +18 0 367000 +2203 0 383000 +265 0 400000 +224 0 417000 +254 0 433000 +252 0 450000 +273 0 467000 +208 0 483000 +154 0 500000 +182 0 517000 +138 0 533000 +18 0 550000 +2502 0 567000 +286 0 583000 +304 0 600000 +341 0 617000 +259 0 633000 +275 0 650000 +222 0 667000 +254 0 683000 +253 0 700000 +225 0 717000 +18 0 733000 +2501 0 750000 +282 0 767000 +298 0 783000 +252 0 800000 +242 0 817000 +250 0 833000 +260 0 850000 +218 0 867000 +213 0 883000 +144 0 900000 +18 0 917000 +233 0 933000 +254 0 950000 +229 0 967000 +239 0 983000 diff --git a/media/res/bbb_vp9_176x144_285kbps_60fps.vp9 b/media/res/bbb_vp9_176x144_285kbps_60fps.vp9 Binary files differnew file mode 100644 index 000000000..2633c8a6c --- /dev/null +++ b/media/res/bbb_vp9_176x144_285kbps_60fps.vp9 |