1f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M/* 2f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M * Copyright (C) 2017 The Android Open Source Project 3f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M * 4f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M * Licensed under the Apache License, Version 2.0 (the "License"); 5f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M * you may not use this file except in compliance with the License. 6f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M * You may obtain a copy of the License at 7f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M * 8f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M * http://www.apache.org/licenses/LICENSE-2.0 9f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M * 10f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M * Unless required by applicable law or agreed to in writing, software 11f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M * distributed under the License is distributed on an "AS IS" BASIS, 12f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M * See the License for the specific language governing permissions and 14f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M * limitations under the License. 15f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M */ 16f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 17f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M#define LOG_TAG "media_omx_hidl_video_dec_test" 189502b237f735d85341b20f7421ad196b14b476a9Ram Mohan M#ifdef __LP64__ 199502b237f735d85341b20f7421ad196b14b476a9Ram Mohan M#define OMX_ANDROID_COMPILE_AS_32BIT_ON_64BIT_PLATFORMS 209502b237f735d85341b20f7421ad196b14b476a9Ram Mohan M#endif 219502b237f735d85341b20f7421ad196b14b476a9Ram Mohan M 22f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M#include <android-base/logging.h> 23f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 24f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M#include <android/hardware/media/omx/1.0/IOmx.h> 25f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M#include <android/hardware/media/omx/1.0/IOmxNode.h> 26f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M#include <android/hardware/media/omx/1.0/IOmxObserver.h> 27f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M#include <android/hardware/media/omx/1.0/types.h> 28f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M#include <android/hidl/allocator/1.0/IAllocator.h> 29f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M#include <android/hidl/memory/1.0/IMapper.h> 30f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M#include <android/hidl/memory/1.0/IMemory.h> 31f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 32f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Musing ::android::hardware::media::omx::V1_0::IOmx; 33f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Musing ::android::hardware::media::omx::V1_0::IOmxObserver; 34f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Musing ::android::hardware::media::omx::V1_0::IOmxNode; 35f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Musing ::android::hardware::media::omx::V1_0::Message; 36f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Musing ::android::hardware::media::omx::V1_0::CodecBuffer; 37ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan Musing ::android::hardware::media::omx::V1_0::PortMode; 38f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Musing ::android::hidl::allocator::V1_0::IAllocator; 39f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Musing ::android::hidl::memory::V1_0::IMemory; 40f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Musing ::android::hidl::memory::V1_0::IMapper; 41f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Musing ::android::hardware::Return; 42f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Musing ::android::hardware::Void; 43f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Musing ::android::hardware::hidl_vec; 44f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Musing ::android::hardware::hidl_string; 45f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Musing ::android::sp; 46f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 47f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M#include <VtsHalHidlTargetTestBase.h> 48f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M#include <getopt.h> 49bf556d1b91f112405411a3655c582612fe060821Ram Mohan M#include <media/hardware/HardwareAPI.h> 50f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M#include <media_hidl_test_common.h> 51f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M#include <media_video_hidl_test_common.h> 52f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M#include <fstream> 53f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 54f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Mstatic ComponentTestEnvironment* gEnv = nullptr; 55f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 5623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// video decoder test fixture class 57f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Mclass VideoDecHidlTest : public ::testing::VtsHalHidlTargetTestBase { 58dd7e4c414b0e2bddf2bc3d2cbd7bc7f0aee03dedPawin Vongmasa private: 59dd7e4c414b0e2bddf2bc3d2cbd7bc7f0aee03dedPawin Vongmasa typedef ::testing::VtsHalHidlTargetTestBase Super; 60f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M public: 61dd7e4c414b0e2bddf2bc3d2cbd7bc7f0aee03dedPawin Vongmasa ::std::string getTestCaseInfo() const override { 62dd7e4c414b0e2bddf2bc3d2cbd7bc7f0aee03dedPawin Vongmasa return ::std::string() + 63dd7e4c414b0e2bddf2bc3d2cbd7bc7f0aee03dedPawin Vongmasa "Component: " + gEnv->getComponent().c_str() + " | " + 64dd7e4c414b0e2bddf2bc3d2cbd7bc7f0aee03dedPawin Vongmasa "Role: " + gEnv->getRole().c_str() + " | " + 65dd7e4c414b0e2bddf2bc3d2cbd7bc7f0aee03dedPawin Vongmasa "Instance: " + gEnv->getInstance().c_str() + " | " + 66dd7e4c414b0e2bddf2bc3d2cbd7bc7f0aee03dedPawin Vongmasa "Res: " + gEnv->getRes().c_str(); 67dd7e4c414b0e2bddf2bc3d2cbd7bc7f0aee03dedPawin Vongmasa } 68dd7e4c414b0e2bddf2bc3d2cbd7bc7f0aee03dedPawin Vongmasa 69f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M virtual void SetUp() override { 70dd7e4c414b0e2bddf2bc3d2cbd7bc7f0aee03dedPawin Vongmasa Super::SetUp(); 71a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M disableTest = false; 72f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M android::hardware::media::omx::V1_0::Status status; 73dd7e4c414b0e2bddf2bc3d2cbd7bc7f0aee03dedPawin Vongmasa omx = Super::getService<IOmx>(gEnv->getInstance()); 74f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_NE(omx, nullptr); 7523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M observer = 76ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M new CodecObserver([this](Message msg, const BufferInfo* buffer) { 77ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M handleMessage(msg, buffer); 78ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M }); 79f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_NE(observer, nullptr); 80a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (strncmp(gEnv->getComponent().c_str(), "OMX.", 4) != 0) 81a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M disableTest = true; 82f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M EXPECT_TRUE(omx->allocateNode( 83f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M gEnv->getComponent(), observer, 84f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M [&](android::hardware::media::omx::V1_0::Status _s, 85f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M sp<IOmxNode> const& _nl) { 86f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = _s; 87f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M this->omxNode = _nl; 88f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M }) 89f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M .isOk()); 9068df40f9cf3b8be9c9453b9468f73dc6e049ad20Ray Essick if (status == android::hardware::media::omx::V1_0::Status::NAME_NOT_FOUND) { 9168df40f9cf3b8be9c9453b9468f73dc6e049ad20Ray Essick disableTest = true; 9268df40f9cf3b8be9c9453b9468f73dc6e049ad20Ray Essick std::cout << "[ WARN ] Test Disabled, component not present\n"; 9368df40f9cf3b8be9c9453b9468f73dc6e049ad20Ray Essick return; 9468df40f9cf3b8be9c9453b9468f73dc6e049ad20Ray Essick } 957bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 96f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_NE(omxNode, nullptr); 97f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_NE(gEnv->getRole().empty(), true) << "Invalid Component Role"; 98f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M struct StringToName { 99f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M const char* Name; 100f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M standardComp CompName; 101f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M }; 102f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M const StringToName kStringToName[] = { 103f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M {"h263", h263}, {"avc", avc}, {"mpeg2", mpeg2}, {"mpeg4", mpeg4}, 104f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M {"hevc", hevc}, {"vp8", vp8}, {"vp9", vp9}, 105f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M }; 106f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M const size_t kNumStringToName = 107f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M sizeof(kStringToName) / sizeof(kStringToName[0]); 108f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M const char* pch; 109f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M char substring[OMX_MAX_STRINGNAME_SIZE]; 110f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M strcpy(substring, gEnv->getRole().c_str()); 111f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M pch = strchr(substring, '.'); 112f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_NE(pch, nullptr); 113f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M compName = unknown_comp; 114f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M for (size_t i = 0; i < kNumStringToName; ++i) { 115f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M if (!strcasecmp(pch + 1, kStringToName[i].Name)) { 116f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M compName = kStringToName[i].CompName; 117f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M break; 118f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 119f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 120a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (compName == unknown_comp) disableTest = true; 121f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M struct CompToCompression { 122f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M standardComp CompName; 123f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M OMX_VIDEO_CODINGTYPE eCompressionFormat; 124f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M }; 125f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M static const CompToCompression kCompToCompression[] = { 126f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M {h263, OMX_VIDEO_CodingH263}, {avc, OMX_VIDEO_CodingAVC}, 127f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M {mpeg2, OMX_VIDEO_CodingMPEG2}, {mpeg4, OMX_VIDEO_CodingMPEG4}, 128f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M {hevc, OMX_VIDEO_CodingHEVC}, {vp8, OMX_VIDEO_CodingVP8}, 129f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M {vp9, OMX_VIDEO_CodingVP9}, 130f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M }; 131f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M static const size_t kNumCompToCompression = 132f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M sizeof(kCompToCompression) / sizeof(kCompToCompression[0]); 133f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M size_t i; 134f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M for (i = 0; i < kNumCompToCompression; ++i) { 135f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M if (kCompToCompression[i].CompName == compName) { 136f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M eCompressionFormat = kCompToCompression[i].eCompressionFormat; 137f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M break; 138f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 139f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 140a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (i == kNumCompToCompression) disableTest = true; 141ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M portMode[0] = portMode[1] = PortMode::PRESET_BYTE_BUFFER; 14223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M eosFlag = false; 14323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M framesReceived = 0; 14423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M timestampUs = 0; 14523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M timestampDevTest = false; 146ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M isSecure = false; 14705f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M portSettingsChange = false; 148ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M size_t suffixLen = strlen(".secure"); 149ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (strlen(gEnv->getComponent().c_str()) >= suffixLen) { 150f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M isSecure = 151f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M !strcmp(gEnv->getComponent().c_str() + 152f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M strlen(gEnv->getComponent().c_str()) - suffixLen, 153f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M ".secure"); 154ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } 155ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (isSecure) disableTest = true; 1560a9ac2ac7881fb1db5cec5ddf67b5419379c4da1Ram Mohan M if (disableTest) std::cout << "[ WARN ] Test Disabled \n"; 157f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 158f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 159f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M virtual void TearDown() override { 160f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M if (omxNode != nullptr) { 161a0698429dd47e2f029866765c6980bc8720a7acbRam Mohan M // If you have encountered a fatal failure, it is possible that 162a0698429dd47e2f029866765c6980bc8720a7acbRam Mohan M // freeNode() will not go through. Instead of hanging the app. 163a0698429dd47e2f029866765c6980bc8720a7acbRam Mohan M // let it pass through and report errors 164a0698429dd47e2f029866765c6980bc8720a7acbRam Mohan M if (::testing::Test::HasFatalFailure()) return; 165f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M EXPECT_TRUE((omxNode->freeNode()).isOk()); 166f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M omxNode = nullptr; 167f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 168dd7e4c414b0e2bddf2bc3d2cbd7bc7f0aee03dedPawin Vongmasa Super::TearDown(); 169f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 170f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 17123c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M // callback function to process messages received by onMessages() from IL 17223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M // client. 173ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M void handleMessage(Message msg, const BufferInfo* buffer) { 174ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M (void)buffer; 17523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M if (msg.type == Message::Type::FILL_BUFFER_DONE) { 17623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M if (msg.data.extendedBufferData.flags & OMX_BUFFERFLAG_EOS) { 17723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M eosFlag = true; 17823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M } 17923c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M if (msg.data.extendedBufferData.rangeLength != 0) { 18023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M framesReceived += 1; 18123c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M // For decoder components current timestamp always exceeds 18223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M // previous timestamp 18323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M EXPECT_GE(msg.data.extendedBufferData.timestampUs, timestampUs); 18423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M timestampUs = msg.data.extendedBufferData.timestampUs; 18523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M // Test if current timestamp is among the list of queued 18623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M // timestamps 18723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M if (timestampDevTest) { 18823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M bool tsHit = false; 18923c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M android::List<uint64_t>::iterator it = 19023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M timestampUslist.begin(); 19123c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M while (it != timestampUslist.end()) { 19223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M if (*it == timestampUs) { 19323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M timestampUslist.erase(it); 19423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M tsHit = true; 19523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M break; 19623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M } 19723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M it++; 19823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M } 19923c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M if (tsHit == false) { 20023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M if (timestampUslist.empty() == false) { 20123c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M EXPECT_EQ(tsHit, true) 20223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M << "TimeStamp not recognized"; 20323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M } else { 2040a9ac2ac7881fb1db5cec5ddf67b5419379c4da1Ram Mohan M std::cout << "[ INFO ] Received non-zero " 2050a9ac2ac7881fb1db5cec5ddf67b5419379c4da1Ram Mohan M "output / TimeStamp not recognized \n"; 20623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M } 20723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M } 20823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M } 209ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M#define WRITE_OUTPUT 0 210ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M#if WRITE_OUTPUT 211ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M static int count = 0; 212ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M FILE* ofp = nullptr; 213ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (count) 214ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ofp = fopen("out.bin", "ab"); 215ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M else 216ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ofp = fopen("out.bin", "wb"); 217ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (ofp != nullptr && 218ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M portMode[1] == PortMode::PRESET_BYTE_BUFFER) { 219ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M fwrite(static_cast<void*>(buffer->mMemory->getPointer()), 220ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M sizeof(char), 221ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M msg.data.extendedBufferData.rangeLength, ofp); 222ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M fclose(ofp); 223ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M count++; 224ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } 225ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M#endif 22623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M } 22705f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M } else if (msg.type == Message::Type::EVENT) { 22805f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M if (msg.data.eventData.event == OMX_EventPortSettingsChanged) { 22905f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M if ((msg.data.eventData.data2 == OMX_IndexParamPortDefinition || 23005f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M msg.data.eventData.data2 == 0)) { 23105f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M portSettingsChange = true; 23205f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M } 23305f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M } 23423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M } 23523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M } 23623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M 237f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M enum standardComp { 238f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M h263, 239f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M avc, 240f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M mpeg2, 241f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M mpeg4, 242f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M hevc, 243f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M vp8, 244f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M vp9, 245f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M unknown_comp, 246f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M }; 247f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 248f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M sp<IOmx> omx; 249f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M sp<CodecObserver> observer; 250f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M sp<IOmxNode> omxNode; 251f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M standardComp compName; 252f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M OMX_VIDEO_CODINGTYPE eCompressionFormat; 253a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M bool disableTest; 254ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M PortMode portMode[2]; 25523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M bool eosFlag; 25623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M uint32_t framesReceived; 25723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M uint64_t timestampUs; 25823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M ::android::List<uint64_t> timestampUslist; 25923c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M bool timestampDevTest; 260ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M bool isSecure; 26105f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M bool portSettingsChange; 262f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 263f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M protected: 264f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M static void description(const std::string& description) { 265f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M RecordProperty("description", description); 266f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 267f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M}; 268f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 269f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M// Set Default port param. 270f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Mvoid setDefaultPortParam(sp<IOmxNode> omxNode, OMX_U32 portIndex, 271f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M OMX_VIDEO_CODINGTYPE eCompressionFormat, 272f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M OMX_COLOR_FORMATTYPE eColorFormat, 273f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M OMX_U32 nFrameWidth = 352, OMX_U32 nFrameHeight = 288, 274f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M OMX_U32 nBitrate = 0, 275f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M OMX_U32 xFramerate = (24U << 16)) { 276f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M switch ((int)eCompressionFormat) { 277f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M case OMX_VIDEO_CodingUnused: 278f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M setupRAWPort(omxNode, portIndex, nFrameWidth, nFrameHeight, 279f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M nBitrate, xFramerate, eColorFormat); 280f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M break; 281f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M default: 282f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M break; 283f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 284f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M} 285f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 286f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M// In decoder components, often the input port parameters get updated upon 287f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M// parsing the header of elementary stream. Client needs to collect this 288f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M// information to reconfigure other ports that share data with this input 289f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M// port. 290f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Mvoid getInputChannelInfo(sp<IOmxNode> omxNode, OMX_U32 kPortIndexInput, 291f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M uint32_t* nFrameWidth, uint32_t* nFrameHeight, 292f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M uint32_t* xFramerate) { 293f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M android::hardware::media::omx::V1_0::Status status; 294f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M *nFrameWidth = 352; 295f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M *nFrameHeight = 288; 296f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M *xFramerate = (24U << 16); 297f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 298f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M OMX_PARAM_PORTDEFINITIONTYPE portDef; 299f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = getPortParam(omxNode, OMX_IndexParamPortDefinition, 300f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M kPortIndexInput, &portDef); 301f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 302f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M if (status == ::android::hardware::media::omx::V1_0::Status::OK) { 303f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M *nFrameWidth = portDef.format.video.nFrameWidth; 304f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M *nFrameHeight = portDef.format.video.nFrameHeight; 305f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M *xFramerate = portDef.format.video.xFramerate; 306f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 307f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M} 308f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 30905f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M// number of elementary streams per component 31005f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M#define STREAM_COUNT 2 311f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M// LookUpTable of clips and metadata for component testing 31223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan Mvoid GetURLForComponent(VideoDecHidlTest::standardComp comp, char* mURL, 31305f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M char* info, size_t streamIndex = 1) { 314f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M struct CompToURL { 315f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M VideoDecHidlTest::standardComp comp; 31605f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M const char mURL[STREAM_COUNT][512]; 31705f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M const char info[STREAM_COUNT][512]; 318f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M }; 31905f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M ASSERT_TRUE(streamIndex < STREAM_COUNT); 32005f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M 321f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M static const CompToURL kCompToURL[] = { 322f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M {VideoDecHidlTest::standardComp::avc, 32305f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M {"bbb_avc_176x144_300kbps_60fps.h264", 32409c89966bfcddc4da5eab33ad1eca88b5d8deb92Ram Mohan M "bbb_avc_640x360_768kbps_30fps.h264"}, 32505f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M {"bbb_avc_176x144_300kbps_60fps.info", 32609c89966bfcddc4da5eab33ad1eca88b5d8deb92Ram Mohan M "bbb_avc_640x360_768kbps_30fps.info"}}, 32723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M {VideoDecHidlTest::standardComp::hevc, 32805f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M {"bbb_hevc_176x144_176kbps_60fps.hevc", 32905f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M "bbb_hevc_640x360_1600kbps_30fps.hevc"}, 33005f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M {"bbb_hevc_176x144_176kbps_60fps.info", 33105f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M "bbb_hevc_640x360_1600kbps_30fps.info"}}, 33223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M {VideoDecHidlTest::standardComp::mpeg2, 33305f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M {"bbb_mpeg2_176x144_105kbps_25fps.m2v", 33405f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M "bbb_mpeg2_352x288_1mbps_60fps.m2v"}, 33505f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M {"bbb_mpeg2_176x144_105kbps_25fps.info", 33605f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M "bbb_mpeg2_352x288_1mbps_60fps.info"}}, 33723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M {VideoDecHidlTest::standardComp::h263, 33805f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M {"", "bbb_h263_352x288_300kbps_12fps.h263"}, 33905f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M {"", "bbb_h263_352x288_300kbps_12fps.info"}}, 34023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M {VideoDecHidlTest::standardComp::mpeg4, 34109c89966bfcddc4da5eab33ad1eca88b5d8deb92Ram Mohan M {"", "bbb_mpeg4_352x288_512kbps_30fps.m4v"}, 34209c89966bfcddc4da5eab33ad1eca88b5d8deb92Ram Mohan M {"", "bbb_mpeg4_352x288_512kbps_30fps.info"}}, 34305f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M {VideoDecHidlTest::standardComp::vp8, 34405f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M {"bbb_vp8_176x144_240kbps_60fps.vp8", 34505f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M "bbb_vp8_640x360_2mbps_30fps.vp8"}, 34605f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M {"bbb_vp8_176x144_240kbps_60fps.info", 34705f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M "bbb_vp8_640x360_2mbps_30fps.info"}}, 34823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M {VideoDecHidlTest::standardComp::vp9, 34905f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M {"bbb_vp9_176x144_285kbps_60fps.vp9", 35005f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M "bbb_vp9_640x360_1600kbps_30fps.vp9"}, 35105f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M {"bbb_vp9_176x144_285kbps_60fps.info", 35205f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M "bbb_vp9_640x360_1600kbps_30fps.info"}}, 353f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M }; 354f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 355f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M for (size_t i = 0; i < sizeof(kCompToURL) / sizeof(kCompToURL[0]); ++i) { 356f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M if (kCompToURL[i].comp == comp) { 35705f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M strcat(mURL, kCompToURL[i].mURL[streamIndex]); 35805f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M strcat(info, kCompToURL[i].info[streamIndex]); 359f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M return; 360f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 361f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 362f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M} 363f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 36423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// port settings reconfiguration during runtime. reconfigures frame dimensions 365f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Mvoid portReconfiguration(sp<IOmxNode> omxNode, sp<CodecObserver> observer, 366f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M android::Vector<BufferInfo>* iBuffer, 367f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M android::Vector<BufferInfo>* oBuffer, 368f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M OMX_U32 kPortIndexInput, OMX_U32 kPortIndexOutput, 369335d3d98594e84230a423594e7039a5f3dc4cac7Ram Mohan M Message msg, PortMode oPortMode, void* args) { 370f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M android::hardware::media::omx::V1_0::Status status; 371335d3d98594e84230a423594e7039a5f3dc4cac7Ram Mohan M (void)args; 372f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 373f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M if (msg.data.eventData.event == OMX_EventPortSettingsChanged) { 374f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(msg.data.eventData.data1, kPortIndexOutput); 37592fb9ab603751d3743c2668835cf278d1509926dRam Mohan M if (msg.data.eventData.data2 == OMX_IndexParamPortDefinition || 37692fb9ab603751d3743c2668835cf278d1509926dRam Mohan M msg.data.eventData.data2 == 0) { 377a230bad8d47ff203beeb84ca0b277fe7c3a9eae6Ram Mohan M // Components can send various kinds of port settings changed events 378a230bad8d47ff203beeb84ca0b277fe7c3a9eae6Ram Mohan M // all at once. Before committing to a full port reconfiguration, 379a230bad8d47ff203beeb84ca0b277fe7c3a9eae6Ram Mohan M // defer any events waiting in the queue to be addressed to a later 380a230bad8d47ff203beeb84ca0b277fe7c3a9eae6Ram Mohan M // point. 381a230bad8d47ff203beeb84ca0b277fe7c3a9eae6Ram Mohan M android::List<Message> msgQueueDefer; 382a230bad8d47ff203beeb84ca0b277fe7c3a9eae6Ram Mohan M while (1) { 383a230bad8d47ff203beeb84ca0b277fe7c3a9eae6Ram Mohan M status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, 384a230bad8d47ff203beeb84ca0b277fe7c3a9eae6Ram Mohan M iBuffer, oBuffer); 385a230bad8d47ff203beeb84ca0b277fe7c3a9eae6Ram Mohan M if (status != 386a230bad8d47ff203beeb84ca0b277fe7c3a9eae6Ram Mohan M android::hardware::media::omx::V1_0::Status::TIMED_OUT) { 387a230bad8d47ff203beeb84ca0b277fe7c3a9eae6Ram Mohan M msgQueueDefer.push_back(msg); 388a230bad8d47ff203beeb84ca0b277fe7c3a9eae6Ram Mohan M continue; 389a230bad8d47ff203beeb84ca0b277fe7c3a9eae6Ram Mohan M } else 390a230bad8d47ff203beeb84ca0b277fe7c3a9eae6Ram Mohan M break; 391a230bad8d47ff203beeb84ca0b277fe7c3a9eae6Ram Mohan M } 392f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = omxNode->sendCommand( 393f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M toRawCommandType(OMX_CommandPortDisable), kPortIndexOutput); 394f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); 395f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 396f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, iBuffer, 397f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M oBuffer); 398f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M if (status == 399f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M android::hardware::media::omx::V1_0::Status::TIMED_OUT) { 400f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M for (size_t i = 0; i < oBuffer->size(); ++i) { 401f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // test if client got all its buffers back 402f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M EXPECT_EQ((*oBuffer)[i].owner, client); 403f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // free the buffers 404f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = 405f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M omxNode->freeBuffer(kPortIndexOutput, (*oBuffer)[i].id); 406f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(status, 407f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M android::hardware::media::omx::V1_0::Status::OK); 408f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 409f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, 410f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M iBuffer, oBuffer); 411f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(status, 412f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M android::hardware::media::omx::V1_0::Status::OK); 413f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(msg.type, Message::Type::EVENT); 414f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(msg.data.eventData.event, OMX_EventCmdComplete); 415f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(msg.data.eventData.data1, OMX_CommandPortDisable); 416f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(msg.data.eventData.data2, kPortIndexOutput); 417f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 418f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // set Port Params 419f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M uint32_t nFrameWidth, nFrameHeight, xFramerate; 420f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, 421f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M &nFrameHeight, &xFramerate); 422bf556d1b91f112405411a3655c582612fe060821Ram Mohan M // get configured color format 423bf556d1b91f112405411a3655c582612fe060821Ram Mohan M OMX_PARAM_PORTDEFINITIONTYPE portDef; 424bf556d1b91f112405411a3655c582612fe060821Ram Mohan M status = getPortParam(omxNode, OMX_IndexParamPortDefinition, 425bf556d1b91f112405411a3655c582612fe060821Ram Mohan M kPortIndexOutput, &portDef); 426f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M setDefaultPortParam(omxNode, kPortIndexOutput, 427bf556d1b91f112405411a3655c582612fe060821Ram Mohan M OMX_VIDEO_CodingUnused, 428bf556d1b91f112405411a3655c582612fe060821Ram Mohan M portDef.format.video.eColorFormat, 429f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M nFrameWidth, nFrameHeight, 0, xFramerate); 430f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 431f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // If you can disable a port, then you should be able to 4327bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M // enable it as well 433f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = omxNode->sendCommand( 434f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M toRawCommandType(OMX_CommandPortEnable), kPortIndexOutput); 435f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(status, 436f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M android::hardware::media::omx::V1_0::Status::OK); 437f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 438f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // do not enable the port until all the buffers are supplied 439f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, 440f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M iBuffer, oBuffer); 441f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ( 442f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status, 443f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M android::hardware::media::omx::V1_0::Status::TIMED_OUT); 444f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 4457bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(allocatePortBuffers( 4467bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M omxNode, oBuffer, kPortIndexOutput, oPortMode, true)); 447f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, 448f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M iBuffer, oBuffer); 449f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(status, 450f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M android::hardware::media::omx::V1_0::Status::OK); 451f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(msg.type, Message::Type::EVENT); 452f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(msg.data.eventData.data1, OMX_CommandPortEnable); 453f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(msg.data.eventData.data2, kPortIndexOutput); 454f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 455a230bad8d47ff203beeb84ca0b277fe7c3a9eae6Ram Mohan M // Push back deferred messages to the list 456a230bad8d47ff203beeb84ca0b277fe7c3a9eae6Ram Mohan M android::List<Message>::iterator it = msgQueueDefer.begin(); 457a230bad8d47ff203beeb84ca0b277fe7c3a9eae6Ram Mohan M while (it != msgQueueDefer.end()) { 458a230bad8d47ff203beeb84ca0b277fe7c3a9eae6Ram Mohan M status = omxNode->dispatchMessage(*it); 459a230bad8d47ff203beeb84ca0b277fe7c3a9eae6Ram Mohan M ASSERT_EQ( 460a230bad8d47ff203beeb84ca0b277fe7c3a9eae6Ram Mohan M status, 461a230bad8d47ff203beeb84ca0b277fe7c3a9eae6Ram Mohan M ::android::hardware::media::omx::V1_0::Status::OK); 462a230bad8d47ff203beeb84ca0b277fe7c3a9eae6Ram Mohan M it++; 463a230bad8d47ff203beeb84ca0b277fe7c3a9eae6Ram Mohan M } 464a230bad8d47ff203beeb84ca0b277fe7c3a9eae6Ram Mohan M 465f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // dispatch output buffers 466f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M for (size_t i = 0; i < oBuffer->size(); i++) { 4677bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE( 4687bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M dispatchOutputBuffer(omxNode, oBuffer, i, oPortMode)); 469f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 470f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } else { 471f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_TRUE(false); 472f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 473f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } else if (msg.data.eventData.data2 == 474f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M OMX_IndexConfigCommonOutputCrop) { 4750a9ac2ac7881fb1db5cec5ddf67b5419379c4da1Ram Mohan M std::cout << "[ INFO ] OMX_EventPortSettingsChanged/ " 476f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M "OMX_IndexConfigCommonOutputCrop not handled \n"; 477f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } else if (msg.data.eventData.data2 == OMX_IndexVendorStartUnused + 3) { 4780a9ac2ac7881fb1db5cec5ddf67b5419379c4da1Ram Mohan M std::cout << "[ INFO ] OMX_EventPortSettingsChanged/ " 479f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M "kDescribeColorAspectsIndex not handled \n"; 480f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 481f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } else if (msg.data.eventData.event == OMX_EventError) { 4820a9ac2ac7881fb1db5cec5ddf67b5419379c4da1Ram Mohan M std::cerr << "[ ERROR ] OMX_EventError/ " 483f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M "Decode Frame Call might be failed \n"; 4847bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_TRUE(false); 485f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } else { 486f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // something unexpected happened 487f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_TRUE(false); 488f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 489f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M} 490f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 49123c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// blocking call to ensures application to Wait till all the inputs are consumed 49223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan Mvoid waitOnInputConsumption(sp<IOmxNode> omxNode, sp<CodecObserver> observer, 49323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M android::Vector<BufferInfo>* iBuffer, 49423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M android::Vector<BufferInfo>* oBuffer, 495ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M OMX_U32 kPortIndexInput, OMX_U32 kPortIndexOutput, 496ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M PortMode oPortMode) { 49723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M android::hardware::media::omx::V1_0::Status status; 49823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M Message msg; 499df47955adf56dbf925763545a6f6036654d320afRam Mohan M int timeOut = TIMEOUT_COUNTER_Q; 50023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M 501ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M while (timeOut--) { 50223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M size_t i = 0; 50323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M status = 504df47955adf56dbf925763545a6f6036654d320afRam Mohan M observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_Q, iBuffer, oBuffer); 50523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M if (status == android::hardware::media::omx::V1_0::Status::OK) { 5067bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_EQ(msg.type, Message::Type::EVENT); 5077bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(portReconfiguration( 5087bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M omxNode, observer, iBuffer, oBuffer, kPortIndexInput, 5097bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexOutput, msg, oPortMode, nullptr)); 51023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M } 51123c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M // status == TIMED_OUT, it could be due to process time being large 51223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M // than DEFAULT_TIMEOUT or component needs output buffers to start 51323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M // processing. 51423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M for (; i < iBuffer->size(); i++) { 51523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M if ((*iBuffer)[i].owner != client) break; 51623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M } 51723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M if (i == iBuffer->size()) break; 51823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M 51923c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M // Dispatch an output buffer assuming outQueue.empty() is true 52023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M size_t index; 52123c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { 5227bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE( 5237bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M dispatchOutputBuffer(omxNode, oBuffer, index, oPortMode)); 524df47955adf56dbf925763545a6f6036654d320afRam Mohan M timeOut = TIMEOUT_COUNTER_Q; 52523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M } 52623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M } 52723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M} 52823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M 529f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M// Decode N Frames 530f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Mvoid decodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer, 531f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M android::Vector<BufferInfo>* iBuffer, 532f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M android::Vector<BufferInfo>* oBuffer, 533f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M OMX_U32 kPortIndexInput, OMX_U32 kPortIndexOutput, 53423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M std::ifstream& eleStream, android::Vector<FrameData>* Info, 535ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M int offset, int range, PortMode oPortMode, 536ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M bool signalEOS = true) { 537f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M android::hardware::media::omx::V1_0::Status status; 538f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M Message msg; 5390cf6b3df5ba7cb5bd56f88377401286f157cc7d9Ram Mohan M size_t index; 54023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M uint32_t flags = 0; 54123c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M int frameID = offset; 542df47955adf56dbf925763545a6f6036654d320afRam Mohan M int timeOut = TIMEOUT_COUNTER_Q; 543df47955adf56dbf925763545a6f6036654d320afRam Mohan M bool iQueued, oQueued; 5440cf6b3df5ba7cb5bd56f88377401286f157cc7d9Ram Mohan M 545f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M while (1) { 546df47955adf56dbf925763545a6f6036654d320afRam Mohan M iQueued = oQueued = false; 547f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = 548df47955adf56dbf925763545a6f6036654d320afRam Mohan M observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_Q, iBuffer, oBuffer); 549f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // Port Reconfiguration 550f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M if (status == android::hardware::media::omx::V1_0::Status::OK && 551f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M msg.type == Message::Type::EVENT) { 5527bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(portReconfiguration( 5537bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M omxNode, observer, iBuffer, oBuffer, kPortIndexInput, 5547bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexOutput, msg, oPortMode, nullptr)); 555f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 556f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 55723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M if (frameID == (int)Info->size() || frameID == (offset + range)) break; 558f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 559f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // Dispatch input buffer 560f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M if ((index = getEmptyBufferID(iBuffer)) < iBuffer->size()) { 561f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M char* ipBuffer = static_cast<char*>( 562f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M static_cast<void*>((*iBuffer)[index].mMemory->getPointer())); 56323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M ASSERT_LE((*Info)[frameID].bytesCount, 564f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M static_cast<int>((*iBuffer)[index].mMemory->getSize())); 56523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M eleStream.read(ipBuffer, (*Info)[frameID].bytesCount); 56623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M ASSERT_EQ(eleStream.gcount(), (*Info)[frameID].bytesCount); 56723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M flags = (*Info)[frameID].flags; 5680cf6b3df5ba7cb5bd56f88377401286f157cc7d9Ram Mohan M // Indicate to omx core that the buffer contains a full frame worth 5690cf6b3df5ba7cb5bd56f88377401286f157cc7d9Ram Mohan M // of data 5700cf6b3df5ba7cb5bd56f88377401286f157cc7d9Ram Mohan M flags |= OMX_BUFFERFLAG_ENDOFFRAME; 5710cf6b3df5ba7cb5bd56f88377401286f157cc7d9Ram Mohan M // Indicate the omx core that this is the last buffer it needs to 5720cf6b3df5ba7cb5bd56f88377401286f157cc7d9Ram Mohan M // process 57323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M if (signalEOS && ((frameID == (int)Info->size() - 1) || 57423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M (frameID == (offset + range - 1)))) 57523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M flags |= OMX_BUFFERFLAG_EOS; 5767bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(dispatchInputBuffer( 5777bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M omxNode, iBuffer, index, (*Info)[frameID].bytesCount, flags, 5787bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M (*Info)[frameID].timestamp)); 57923c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M frameID++; 580df47955adf56dbf925763545a6f6036654d320afRam Mohan M iQueued = true; 581df47955adf56dbf925763545a6f6036654d320afRam Mohan M } 5820cf6b3df5ba7cb5bd56f88377401286f157cc7d9Ram Mohan M // Dispatch output buffer 583f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { 5847bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE( 5857bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M dispatchOutputBuffer(omxNode, oBuffer, index, oPortMode)); 586df47955adf56dbf925763545a6f6036654d320afRam Mohan M oQueued = true; 587df47955adf56dbf925763545a6f6036654d320afRam Mohan M } 5880cf6b3df5ba7cb5bd56f88377401286f157cc7d9Ram Mohan M // Reset Counters when either input or output buffer is dispatched 589df47955adf56dbf925763545a6f6036654d320afRam Mohan M if (iQueued || oQueued) 590df47955adf56dbf925763545a6f6036654d320afRam Mohan M timeOut = TIMEOUT_COUNTER_Q; 591ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M else 592df47955adf56dbf925763545a6f6036654d320afRam Mohan M timeOut--; 593ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (timeOut == 0) { 5947bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_TRUE(false) << "Wait on Input/Output is found indefinite"; 595f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 596f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 597f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M} 598f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 599bf556d1b91f112405411a3655c582612fe060821Ram Mohan M// DescribeColorFormatParams Copy Constructor (Borrowed from OMXUtils.cpp) 600bf556d1b91f112405411a3655c582612fe060821Ram Mohan Mandroid::DescribeColorFormatParams::DescribeColorFormatParams( 601bf556d1b91f112405411a3655c582612fe060821Ram Mohan M const android::DescribeColorFormat2Params& params) { 602bf556d1b91f112405411a3655c582612fe060821Ram Mohan M eColorFormat = params.eColorFormat; 603bf556d1b91f112405411a3655c582612fe060821Ram Mohan M nFrameWidth = params.nFrameWidth; 604bf556d1b91f112405411a3655c582612fe060821Ram Mohan M nFrameHeight = params.nFrameHeight; 605bf556d1b91f112405411a3655c582612fe060821Ram Mohan M nStride = params.nStride; 606bf556d1b91f112405411a3655c582612fe060821Ram Mohan M nSliceHeight = params.nSliceHeight; 607bf556d1b91f112405411a3655c582612fe060821Ram Mohan M bUsingNativeBuffers = params.bUsingNativeBuffers; 608bf556d1b91f112405411a3655c582612fe060821Ram Mohan M}; 609bf556d1b91f112405411a3655c582612fe060821Ram Mohan M 610bf556d1b91f112405411a3655c582612fe060821Ram Mohan Mbool isColorFormatFlexibleYUV(sp<IOmxNode> omxNode, 611bf556d1b91f112405411a3655c582612fe060821Ram Mohan M OMX_COLOR_FORMATTYPE eColorFormat) { 612bf556d1b91f112405411a3655c582612fe060821Ram Mohan M android::hardware::media::omx::V1_0::Status status; 613bf556d1b91f112405411a3655c582612fe060821Ram Mohan M unsigned int index = OMX_IndexMax, index2 = OMX_IndexMax; 614bf556d1b91f112405411a3655c582612fe060821Ram Mohan M omxNode->getExtensionIndex( 615bf556d1b91f112405411a3655c582612fe060821Ram Mohan M "OMX.google.android.index.describeColorFormat", 616bf556d1b91f112405411a3655c582612fe060821Ram Mohan M [&index](android::hardware::media::omx::V1_0::Status _s, 617bf556d1b91f112405411a3655c582612fe060821Ram Mohan M unsigned int _nl) { 618bf556d1b91f112405411a3655c582612fe060821Ram Mohan M if (_s == ::android::hardware::media::omx::V1_0::Status::OK) 619bf556d1b91f112405411a3655c582612fe060821Ram Mohan M index = _nl; 620bf556d1b91f112405411a3655c582612fe060821Ram Mohan M }); 621bf556d1b91f112405411a3655c582612fe060821Ram Mohan M omxNode->getExtensionIndex( 622bf556d1b91f112405411a3655c582612fe060821Ram Mohan M "OMX.google.android.index.describeColorFormat2", 623bf556d1b91f112405411a3655c582612fe060821Ram Mohan M [&index2](android::hardware::media::omx::V1_0::Status _s, 624bf556d1b91f112405411a3655c582612fe060821Ram Mohan M unsigned int _nl) { 625bf556d1b91f112405411a3655c582612fe060821Ram Mohan M if (_s == ::android::hardware::media::omx::V1_0::Status::OK) 626bf556d1b91f112405411a3655c582612fe060821Ram Mohan M index2 = _nl; 627bf556d1b91f112405411a3655c582612fe060821Ram Mohan M }); 628bf556d1b91f112405411a3655c582612fe060821Ram Mohan M 629bf556d1b91f112405411a3655c582612fe060821Ram Mohan M android::DescribeColorFormat2Params describeParams; 630bf556d1b91f112405411a3655c582612fe060821Ram Mohan M describeParams.eColorFormat = eColorFormat; 631bf556d1b91f112405411a3655c582612fe060821Ram Mohan M describeParams.nFrameWidth = 128; 632bf556d1b91f112405411a3655c582612fe060821Ram Mohan M describeParams.nFrameHeight = 128; 633bf556d1b91f112405411a3655c582612fe060821Ram Mohan M describeParams.nStride = 128; 634bf556d1b91f112405411a3655c582612fe060821Ram Mohan M describeParams.nSliceHeight = 128; 635bf556d1b91f112405411a3655c582612fe060821Ram Mohan M describeParams.bUsingNativeBuffers = OMX_FALSE; 636bf556d1b91f112405411a3655c582612fe060821Ram Mohan M if (index != OMX_IndexMax) { 637bf556d1b91f112405411a3655c582612fe060821Ram Mohan M android::DescribeColorFormatParams describeParamsV1(describeParams); 638bf556d1b91f112405411a3655c582612fe060821Ram Mohan M status = getParam(omxNode, static_cast<OMX_INDEXTYPE>(index), 639bf556d1b91f112405411a3655c582612fe060821Ram Mohan M &describeParamsV1); 640bf556d1b91f112405411a3655c582612fe060821Ram Mohan M if (status == ::android::hardware::media::omx::V1_0::Status::OK) { 641bf556d1b91f112405411a3655c582612fe060821Ram Mohan M android::MediaImage& img = describeParamsV1.sMediaImage; 642bf556d1b91f112405411a3655c582612fe060821Ram Mohan M if (img.mType == android::MediaImage::MEDIA_IMAGE_TYPE_YUV) { 643bf556d1b91f112405411a3655c582612fe060821Ram Mohan M if (img.mNumPlanes == 3 && 644bf556d1b91f112405411a3655c582612fe060821Ram Mohan M img.mPlane[img.Y].mHorizSubsampling == 1 && 645bf556d1b91f112405411a3655c582612fe060821Ram Mohan M img.mPlane[img.Y].mVertSubsampling == 1) { 646bf556d1b91f112405411a3655c582612fe060821Ram Mohan M if (img.mPlane[img.U].mHorizSubsampling == 2 && 647bf556d1b91f112405411a3655c582612fe060821Ram Mohan M img.mPlane[img.U].mVertSubsampling == 2 && 648bf556d1b91f112405411a3655c582612fe060821Ram Mohan M img.mPlane[img.V].mHorizSubsampling == 2 && 649bf556d1b91f112405411a3655c582612fe060821Ram Mohan M img.mPlane[img.V].mVertSubsampling == 2) { 650bf556d1b91f112405411a3655c582612fe060821Ram Mohan M if (img.mBitDepth <= 8) { 651bf556d1b91f112405411a3655c582612fe060821Ram Mohan M return true; 652bf556d1b91f112405411a3655c582612fe060821Ram Mohan M } 653bf556d1b91f112405411a3655c582612fe060821Ram Mohan M } 654bf556d1b91f112405411a3655c582612fe060821Ram Mohan M } 655bf556d1b91f112405411a3655c582612fe060821Ram Mohan M } 656bf556d1b91f112405411a3655c582612fe060821Ram Mohan M } 657bf556d1b91f112405411a3655c582612fe060821Ram Mohan M } else if (index2 != OMX_IndexMax) { 658bf556d1b91f112405411a3655c582612fe060821Ram Mohan M status = getParam(omxNode, static_cast<OMX_INDEXTYPE>(index2), 659bf556d1b91f112405411a3655c582612fe060821Ram Mohan M &describeParams); 660bf556d1b91f112405411a3655c582612fe060821Ram Mohan M android::MediaImage2& img = describeParams.sMediaImage; 661bf556d1b91f112405411a3655c582612fe060821Ram Mohan M if (img.mType == android::MediaImage2::MEDIA_IMAGE_TYPE_YUV) { 662bf556d1b91f112405411a3655c582612fe060821Ram Mohan M if (img.mNumPlanes == 3 && 663bf556d1b91f112405411a3655c582612fe060821Ram Mohan M img.mPlane[img.Y].mHorizSubsampling == 1 && 664bf556d1b91f112405411a3655c582612fe060821Ram Mohan M img.mPlane[img.Y].mVertSubsampling == 1) { 665bf556d1b91f112405411a3655c582612fe060821Ram Mohan M if (img.mPlane[img.U].mHorizSubsampling == 2 && 666bf556d1b91f112405411a3655c582612fe060821Ram Mohan M img.mPlane[img.U].mVertSubsampling == 2 && 667bf556d1b91f112405411a3655c582612fe060821Ram Mohan M img.mPlane[img.V].mHorizSubsampling == 2 && 668bf556d1b91f112405411a3655c582612fe060821Ram Mohan M img.mPlane[img.V].mVertSubsampling == 2) { 669bf556d1b91f112405411a3655c582612fe060821Ram Mohan M if (img.mBitDepth <= 8) { 670bf556d1b91f112405411a3655c582612fe060821Ram Mohan M return true; 671bf556d1b91f112405411a3655c582612fe060821Ram Mohan M } 672bf556d1b91f112405411a3655c582612fe060821Ram Mohan M } 673bf556d1b91f112405411a3655c582612fe060821Ram Mohan M } 674bf556d1b91f112405411a3655c582612fe060821Ram Mohan M } 675bf556d1b91f112405411a3655c582612fe060821Ram Mohan M } 676bf556d1b91f112405411a3655c582612fe060821Ram Mohan M return false; 677bf556d1b91f112405411a3655c582612fe060821Ram Mohan M} 678bf556d1b91f112405411a3655c582612fe060821Ram Mohan M 679bf556d1b91f112405411a3655c582612fe060821Ram Mohan M// get default color format for output port 680bf556d1b91f112405411a3655c582612fe060821Ram Mohan Mvoid getDefaultColorFormat(sp<IOmxNode> omxNode, OMX_U32 kPortIndexOutput, 681bf556d1b91f112405411a3655c582612fe060821Ram Mohan M PortMode oPortMode, 682bf556d1b91f112405411a3655c582612fe060821Ram Mohan M OMX_COLOR_FORMATTYPE* eColorFormat) { 683bf556d1b91f112405411a3655c582612fe060821Ram Mohan M android::hardware::media::omx::V1_0::Status status; 684bf556d1b91f112405411a3655c582612fe060821Ram Mohan M OMX_VIDEO_PARAM_PORTFORMATTYPE portFormat; 685bf556d1b91f112405411a3655c582612fe060821Ram Mohan M *eColorFormat = OMX_COLOR_FormatUnused; 686bf556d1b91f112405411a3655c582612fe060821Ram Mohan M portFormat.nIndex = 0; 687a7ea9ae197a22f90753bfc6f20de2ad94aea49f6Ram Mohan M while (portFormat.nIndex < 512) { 688bf556d1b91f112405411a3655c582612fe060821Ram Mohan M status = getPortParam(omxNode, OMX_IndexParamVideoPortFormat, 689bf556d1b91f112405411a3655c582612fe060821Ram Mohan M kPortIndexOutput, &portFormat); 690bf556d1b91f112405411a3655c582612fe060821Ram Mohan M if (status != ::android::hardware::media::omx::V1_0::Status::OK) break; 691bf556d1b91f112405411a3655c582612fe060821Ram Mohan M EXPECT_EQ(portFormat.eCompressionFormat, OMX_VIDEO_CodingUnused); 692bf556d1b91f112405411a3655c582612fe060821Ram Mohan M if (oPortMode != PortMode::PRESET_BYTE_BUFFER) { 693bf556d1b91f112405411a3655c582612fe060821Ram Mohan M *eColorFormat = portFormat.eColorFormat; 694bf556d1b91f112405411a3655c582612fe060821Ram Mohan M break; 695bf556d1b91f112405411a3655c582612fe060821Ram Mohan M } 696bf556d1b91f112405411a3655c582612fe060821Ram Mohan M if (isColorFormatFlexibleYUV(omxNode, portFormat.eColorFormat)) { 697bf556d1b91f112405411a3655c582612fe060821Ram Mohan M *eColorFormat = portFormat.eColorFormat; 698bf556d1b91f112405411a3655c582612fe060821Ram Mohan M break; 699bf556d1b91f112405411a3655c582612fe060821Ram Mohan M } 700bf556d1b91f112405411a3655c582612fe060821Ram Mohan M if (OMX_COLOR_FormatYUV420SemiPlanar == portFormat.eColorFormat || 701a7ea9ae197a22f90753bfc6f20de2ad94aea49f6Ram Mohan M OMX_COLOR_FormatYUV420Planar == portFormat.eColorFormat || 702a7ea9ae197a22f90753bfc6f20de2ad94aea49f6Ram Mohan M OMX_COLOR_FormatYUV420PackedPlanar == portFormat.eColorFormat || 703a7ea9ae197a22f90753bfc6f20de2ad94aea49f6Ram Mohan M OMX_COLOR_FormatYUV420PackedSemiPlanar == portFormat.eColorFormat) { 704bf556d1b91f112405411a3655c582612fe060821Ram Mohan M *eColorFormat = portFormat.eColorFormat; 705bf556d1b91f112405411a3655c582612fe060821Ram Mohan M break; 706bf556d1b91f112405411a3655c582612fe060821Ram Mohan M } 707bf556d1b91f112405411a3655c582612fe060821Ram Mohan M portFormat.nIndex++; 708bf556d1b91f112405411a3655c582612fe060821Ram Mohan M } 709bf556d1b91f112405411a3655c582612fe060821Ram Mohan M} 710bf556d1b91f112405411a3655c582612fe060821Ram Mohan M 71123c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// set component role 712f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan MTEST_F(VideoDecHidlTest, SetRole) { 713f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M description("Test Set Component Role"); 714a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (disableTest) return; 715f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M android::hardware::media::omx::V1_0::Status status; 716f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = setRole(omxNode, gEnv->getRole().c_str()); 717f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 718f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M} 719f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 72023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// port format enumeration 721f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan MTEST_F(VideoDecHidlTest, EnumeratePortFormat) { 722f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M description("Test Component on Mandatory Port Parameters (Port Format)"); 723a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (disableTest) return; 724f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M android::hardware::media::omx::V1_0::Status status; 725f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M uint32_t kPortIndexInput = 0, kPortIndexOutput = 1; 726f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatYUV420Planar; 727f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M OMX_U32 xFramerate = (24U << 16); 728f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = setRole(omxNode, gEnv->getRole().c_str()); 729f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 730f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M OMX_PORT_PARAM_TYPE params; 731f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms); 732f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M if (status == ::android::hardware::media::omx::V1_0::Status::OK) { 733f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(params.nPorts, 2U); 734f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M kPortIndexInput = params.nStartPortNumber; 735f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M kPortIndexOutput = kPortIndexInput + 1; 736f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 737f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = setVideoPortFormat(omxNode, kPortIndexInput, eCompressionFormat, 738f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M OMX_COLOR_FormatUnused, 0U); 739f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 740f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = 741f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M setVideoPortFormat(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, 742f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M eColorFormat, xFramerate); 743f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 744f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M} 745f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 74623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// test port settings reconfiguration, elementary stream decode and timestamp 74723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// deviation 748f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan MTEST_F(VideoDecHidlTest, DecodeTest) { 74923c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M description("Tests Port Reconfiguration, Decode and timestamp deviation"); 750a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (disableTest) return; 751f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M android::hardware::media::omx::V1_0::Status status; 752f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M uint32_t kPortIndexInput = 0, kPortIndexOutput = 1; 753f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = setRole(omxNode, gEnv->getRole().c_str()); 754f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 755f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M OMX_PORT_PARAM_TYPE params; 756f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms); 757f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M if (status == ::android::hardware::media::omx::V1_0::Status::OK) { 758f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(params.nPorts, 2U); 759f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M kPortIndexInput = params.nStartPortNumber; 760f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M kPortIndexOutput = kPortIndexInput + 1; 761f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 76223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M char mURL[512], info[512]; 76323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M strcpy(mURL, gEnv->getRes().c_str()); 76423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M strcpy(info, gEnv->getRes().c_str()); 76523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M GetURLForComponent(compName, mURL, info); 766f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 767f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M std::ifstream eleStream, eleInfo; 76823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M 769f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M eleInfo.open(info); 770f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(eleInfo.is_open(), true); 77123c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M android::Vector<FrameData> Info; 77296743b42576bb508cd0820e9503a7d82003a682bRam Mohan M int bytesCount = 0, maxBytesCount = 0; 77323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M uint32_t flags = 0; 77423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M uint32_t timestamp = 0; 77523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M timestampDevTest = true; 77623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M while (1) { 77723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M if (!(eleInfo >> bytesCount)) break; 77823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M eleInfo >> flags; 77923c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M eleInfo >> timestamp; 78023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M Info.push_back({bytesCount, flags, timestamp}); 781dc6270ecc1d6a3ac18b2820ef176bb4ea58fba3fRam Mohan M if (timestampDevTest && (flags != OMX_BUFFERFLAG_CODECCONFIG)) 78223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M timestampUslist.push_back(timestamp); 78396743b42576bb508cd0820e9503a7d82003a682bRam Mohan M if (maxBytesCount < bytesCount) maxBytesCount = bytesCount; 78423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M } 78523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M eleInfo.close(); 786f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 78796743b42576bb508cd0820e9503a7d82003a682bRam Mohan M // As the frame sizes are known ahead, use it to configure i/p buffer size 78896743b42576bb508cd0820e9503a7d82003a682bRam Mohan M maxBytesCount = ALIGN_POWER_OF_TWO(maxBytesCount, 10); 78996743b42576bb508cd0820e9503a7d82003a682bRam Mohan M status = setPortBufferSize(omxNode, kPortIndexInput, maxBytesCount); 79096743b42576bb508cd0820e9503a7d82003a682bRam Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 79196743b42576bb508cd0820e9503a7d82003a682bRam Mohan M 792ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M // set port mode 793f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M portMode[0] = PortMode::PRESET_BYTE_BUFFER; 794f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M portMode[1] = PortMode::DYNAMIC_ANW_BUFFER; 795f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M status = omxNode->setPortMode(kPortIndexInput, portMode[0]); 796f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 797f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); 798f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M if (status != ::android::hardware::media::omx::V1_0::Status::OK) { 799f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M portMode[1] = PortMode::PRESET_BYTE_BUFFER; 800ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); 801ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 802ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } 803ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 804f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // set Port Params 805f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M uint32_t nFrameWidth, nFrameHeight, xFramerate; 806f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight, 807f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M &xFramerate); 808bf556d1b91f112405411a3655c582612fe060821Ram Mohan M // get default color format 809bf556d1b91f112405411a3655c582612fe060821Ram Mohan M OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused; 810bf556d1b91f112405411a3655c582612fe060821Ram Mohan M getDefaultColorFormat(omxNode, kPortIndexOutput, portMode[1], 811bf556d1b91f112405411a3655c582612fe060821Ram Mohan M &eColorFormat); 812bf556d1b91f112405411a3655c582612fe060821Ram Mohan M ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused); 813bf556d1b91f112405411a3655c582612fe060821Ram Mohan M status = 814bf556d1b91f112405411a3655c582612fe060821Ram Mohan M setVideoPortFormat(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, 815bf556d1b91f112405411a3655c582612fe060821Ram Mohan M eColorFormat, xFramerate); 816bf556d1b91f112405411a3655c582612fe060821Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 817f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, 818f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate); 81996743b42576bb508cd0820e9503a7d82003a682bRam Mohan M 820f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M android::Vector<BufferInfo> iBuffer, oBuffer; 821f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 822f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // set state to idle 8237bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle( 8247bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, 8257bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexOutput, portMode, true)); 826f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // set state to executing 8277bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); 828ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 829f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // Port Reconfiguration 83023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M eleStream.open(mURL, std::ifstream::binary); 83123c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M ASSERT_EQ(eleStream.is_open(), true); 8327bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(decodeNFrames( 8337bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, 8347bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexOutput, eleStream, &Info, 0, (int)Info.size(), portMode[1])); 83523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M eleStream.close(); 8367bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE( 8377bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, 8387bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexInput, kPortIndexOutput, portMode[1])); 8397bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(testEOS( 8407bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, portMode, 8417bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr)); 842dc6270ecc1d6a3ac18b2820ef176bb4ea58fba3fRam Mohan M if (timestampDevTest) EXPECT_EQ(timestampUslist.empty(), true); 843f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // set state to idle 8447bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE( 8457bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); 846f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // set state to executing 8477bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, 8487bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M &oBuffer, kPortIndexInput, 8497bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexOutput)); 85023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M} 851f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 85205f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M// Test for adaptive playback support 85305f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan MTEST_F(VideoDecHidlTest, AdaptivePlaybackTest) { 85405f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M description("Tests for Adaptive Playback support"); 85505f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M if (disableTest) return; 85605f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M if (!(compName == avc || compName == hevc || compName == vp8 || 85705f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M compName == vp9 || compName == mpeg2)) 85805f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M return; 85905f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M android::hardware::media::omx::V1_0::Status status; 86005f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M uint32_t kPortIndexInput = 0, kPortIndexOutput = 1; 86105f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M status = setRole(omxNode, gEnv->getRole().c_str()); 86205f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 86305f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M OMX_PORT_PARAM_TYPE params; 86405f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms); 86505f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M if (status == ::android::hardware::media::omx::V1_0::Status::OK) { 86605f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M ASSERT_EQ(params.nPorts, 2U); 86705f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M kPortIndexInput = params.nStartPortNumber; 86805f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M kPortIndexOutput = kPortIndexInput + 1; 86905f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M } 87005f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M 87105f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M // set port mode 872500052d8f0f7e164e9cc727c7797f88c90c15da1Ram Mohan M portMode[0] = PortMode::PRESET_BYTE_BUFFER; 873500052d8f0f7e164e9cc727c7797f88c90c15da1Ram Mohan M portMode[1] = PortMode::DYNAMIC_ANW_BUFFER; 87405f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M status = omxNode->setPortMode(kPortIndexInput, portMode[0]); 87505f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 87605f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); 877500052d8f0f7e164e9cc727c7797f88c90c15da1Ram Mohan M if (status != ::android::hardware::media::omx::V1_0::Status::OK) { 878500052d8f0f7e164e9cc727c7797f88c90c15da1Ram Mohan M portMode[1] = PortMode::PRESET_BYTE_BUFFER; 879500052d8f0f7e164e9cc727c7797f88c90c15da1Ram Mohan M status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); 880500052d8f0f7e164e9cc727c7797f88c90c15da1Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 881500052d8f0f7e164e9cc727c7797f88c90c15da1Ram Mohan M } 88205f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M 88305f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M // prepare for adaptive playback 88405f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M uint32_t adaptiveMaxWidth = 320; 88505f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M uint32_t adaptiveMaxHeight = 240; 88605f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M status = omxNode->prepareForAdaptivePlayback( 88705f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M kPortIndexOutput, true, adaptiveMaxWidth, adaptiveMaxHeight); 88805f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M if (strncmp(gEnv->getComponent().c_str(), "OMX.google.", 11) == 0) { 88905f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M // SoftOMX Decoders donot support graphic buffer modes. So for them 89005f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M // support for adaptive play back is mandatory in Byte Buffer mode 89105f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 89205f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M } else { 893500052d8f0f7e164e9cc727c7797f88c90c15da1Ram Mohan M // for vendor codecs, support for adaptive play back is optional 894500052d8f0f7e164e9cc727c7797f88c90c15da1Ram Mohan M // in byte buffer mode. 895500052d8f0f7e164e9cc727c7797f88c90c15da1Ram Mohan M if (portMode[1] == PortMode::PRESET_BYTE_BUFFER) return; 896500052d8f0f7e164e9cc727c7797f88c90c15da1Ram Mohan M if (status != ::android::hardware::media::omx::V1_0::Status::OK) return; 89705f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M } 89805f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M 89905f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M // TODO: Handle this better !!! 90005f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M // Without the knowledge of the maximum resolution of the frame to be 90105f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M // decoded it is not possible to choose the size of the input buffer. 90205f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M // The value below is based on the info. files of clips in res folder. 90305f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M status = setPortBufferSize(omxNode, kPortIndexInput, 482304); 90405f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 90505f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M 90605f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M // set Port Params 90705f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M uint32_t nFrameWidth, nFrameHeight, xFramerate; 90805f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight, 90905f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M &xFramerate); 91005f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M // get default color format 91105f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused; 91205f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M getDefaultColorFormat(omxNode, kPortIndexOutput, portMode[1], 91305f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M &eColorFormat); 91405f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused); 91505f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M status = 91605f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M setVideoPortFormat(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, 91705f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M eColorFormat, xFramerate); 91805f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 91905f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, 92005f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate); 92105f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M 92205f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M android::Vector<BufferInfo> iBuffer, oBuffer; 92305f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M 92405f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M // set state to idle 9257bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle( 9267bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, 9277bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexOutput, portMode, true)); 92805f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M // set state to executing 9297bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); 93005f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M 93105f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M timestampDevTest = true; 93205f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M uint32_t timestampOffset = 0; 93305f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M for (uint32_t i = 0; i < STREAM_COUNT * 2; i++) { 93405f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M std::ifstream eleStream, eleInfo; 93505f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M char mURL[512], info[512]; 93605f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M android::Vector<FrameData> Info; 93705f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M strcpy(mURL, gEnv->getRes().c_str()); 93805f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M strcpy(info, gEnv->getRes().c_str()); 93905f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M GetURLForComponent(compName, mURL, info, i % STREAM_COUNT); 94005f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M eleInfo.open(info); 94105f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M ASSERT_EQ(eleInfo.is_open(), true); 94205f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M int bytesCount = 0; 94305f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M uint32_t flags = 0; 94405f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M uint32_t timestamp = 0; 94505f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M uint32_t timestampMax = 0; 94605f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M while (1) { 94705f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M if (!(eleInfo >> bytesCount)) break; 94805f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M eleInfo >> flags; 94905f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M eleInfo >> timestamp; 95005f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M timestamp += timestampOffset; 95105f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M Info.push_back({bytesCount, flags, timestamp}); 95205f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M if (timestampDevTest && (flags != OMX_BUFFERFLAG_CODECCONFIG)) 95305f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M timestampUslist.push_back(timestamp); 95405f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M if (timestampMax < timestamp) timestampMax = timestamp; 95505f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M } 95605f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M timestampOffset = timestampMax; 95705f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M eleInfo.close(); 95805f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M 95905f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M // Port Reconfiguration 96005f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M eleStream.open(mURL, std::ifstream::binary); 96105f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M ASSERT_EQ(eleStream.is_open(), true); 9627bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE( 9637bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, 9647bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexInput, kPortIndexOutput, eleStream, &Info, 9657bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M 0, (int)Info.size(), portMode[1], false)); 96605f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M eleStream.close(); 96705f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M 96805f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, 96905f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M &nFrameHeight, &xFramerate); 97005f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M if ((nFrameWidth > adaptiveMaxWidth) || 97105f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M (nFrameHeight > adaptiveMaxHeight)) { 97205f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M if (nFrameWidth > adaptiveMaxWidth) adaptiveMaxWidth = nFrameWidth; 97305f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M if (nFrameHeight > adaptiveMaxHeight) 97405f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M adaptiveMaxHeight = nFrameHeight; 97505f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M EXPECT_TRUE(portSettingsChange); 97605f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M } else { 97705f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M // In DynamicANW Buffer mode, its ok to do a complete 97805f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M // reconfiguration even if a partial reconfiguration is sufficient. 97905f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M if (portMode[1] != PortMode::DYNAMIC_ANW_BUFFER) 98005f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M EXPECT_FALSE(portSettingsChange); 98105f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M } 98205f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M portSettingsChange = false; 98305f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M } 9847bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE( 9857bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, 9867bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexInput, kPortIndexOutput, portMode[1])); 9877bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(testEOS( 9887bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode, 9897bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr)); 99005f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M if (timestampDevTest) EXPECT_EQ(timestampUslist.empty(), true); 99105f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M // set state to idle 9927bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE( 9937bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); 99405f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M // set state to executing 9957bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, 9967bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M &oBuffer, kPortIndexInput, 9977bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexOutput)); 99805f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M} 99905f81e4d07383933cc6803796f2d19ab80dce3b3Ram Mohan M 100023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// end of sequence test 1001a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan MTEST_F(VideoDecHidlTest, EOSTest_M) { 1002a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M description("Test End of stream monkeying"); 1003a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (disableTest) return; 1004a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M android::hardware::media::omx::V1_0::Status status; 1005a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M uint32_t kPortIndexInput = 0, kPortIndexOutput = 1; 1006a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M status = setRole(omxNode, gEnv->getRole().c_str()); 1007a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1008a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M OMX_PORT_PARAM_TYPE params; 1009a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms); 1010a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (status == ::android::hardware::media::omx::V1_0::Status::OK) { 1011a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M ASSERT_EQ(params.nPorts, 2U); 1012a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M kPortIndexInput = params.nStartPortNumber; 1013a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M kPortIndexOutput = kPortIndexInput + 1; 1014a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M } 1015a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M 1016bf556d1b91f112405411a3655c582612fe060821Ram Mohan M // set port mode 1017bf556d1b91f112405411a3655c582612fe060821Ram Mohan M status = omxNode->setPortMode(kPortIndexInput, portMode[0]); 1018bf556d1b91f112405411a3655c582612fe060821Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1019bf556d1b91f112405411a3655c582612fe060821Ram Mohan M status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); 1020bf556d1b91f112405411a3655c582612fe060821Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1021bf556d1b91f112405411a3655c582612fe060821Ram Mohan M 1022a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M // set Port Params 1023a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M uint32_t nFrameWidth, nFrameHeight, xFramerate; 1024a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight, 1025a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M &xFramerate); 1026bf556d1b91f112405411a3655c582612fe060821Ram Mohan M // get default color format 1027bf556d1b91f112405411a3655c582612fe060821Ram Mohan M OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused; 1028bf556d1b91f112405411a3655c582612fe060821Ram Mohan M getDefaultColorFormat(omxNode, kPortIndexOutput, portMode[1], 1029bf556d1b91f112405411a3655c582612fe060821Ram Mohan M &eColorFormat); 1030bf556d1b91f112405411a3655c582612fe060821Ram Mohan M ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused); 1031bf556d1b91f112405411a3655c582612fe060821Ram Mohan M status = 1032bf556d1b91f112405411a3655c582612fe060821Ram Mohan M setVideoPortFormat(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, 1033bf556d1b91f112405411a3655c582612fe060821Ram Mohan M eColorFormat, xFramerate); 1034bf556d1b91f112405411a3655c582612fe060821Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1035a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, 1036a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate); 1037ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 1038a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M android::Vector<BufferInfo> iBuffer, oBuffer; 1039a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M 1040a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M // set state to idle 10417bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle( 10427bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, 10437bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexOutput, portMode, true)); 1044a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M // set state to executing 10457bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); 1046a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M 1047a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M // request EOS at the start 10487bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(testEOS( 10497bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode, 10507bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr)); 10517bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer, 10527bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexInput, kPortIndexOutput)); 1053a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M EXPECT_GE(framesReceived, 0U); 1054a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M framesReceived = 0; 1055a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M timestampUs = 0; 1056a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M 1057a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M // set state to idle 10587bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE( 10597bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); 1060a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M // set state to executing 10617bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, 10627bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M &oBuffer, kPortIndexInput, 10637bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexOutput)); 1064a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M} 1065a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M 1066a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M// end of sequence test 1067a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan MTEST_F(VideoDecHidlTest, ThumbnailTest) { 1068a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M description("Test Request for thumbnail"); 1069a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (disableTest) return; 107023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M android::hardware::media::omx::V1_0::Status status; 107123c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M uint32_t kPortIndexInput = 0, kPortIndexOutput = 1; 107223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M status = setRole(omxNode, gEnv->getRole().c_str()); 107323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 107423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M OMX_PORT_PARAM_TYPE params; 107523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms); 107623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M if (status == ::android::hardware::media::omx::V1_0::Status::OK) { 107723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M ASSERT_EQ(params.nPorts, 2U); 107823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M kPortIndexInput = params.nStartPortNumber; 107923c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M kPortIndexOutput = kPortIndexInput + 1; 108023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M } 108123c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M char mURL[512], info[512]; 108223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M strcpy(mURL, gEnv->getRes().c_str()); 108323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M strcpy(info, gEnv->getRes().c_str()); 108423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M GetURLForComponent(compName, mURL, info); 108523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M 108623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M std::ifstream eleStream, eleInfo; 108723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M 108823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M eleInfo.open(info); 108923c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M ASSERT_EQ(eleInfo.is_open(), true); 109023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M android::Vector<FrameData> Info; 109196743b42576bb508cd0820e9503a7d82003a682bRam Mohan M int bytesCount = 0, maxBytesCount = 0; 109223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M uint32_t flags = 0; 109323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M uint32_t timestamp = 0; 109423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M while (1) { 109523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M if (!(eleInfo >> bytesCount)) break; 109623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M eleInfo >> flags; 109723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M eleInfo >> timestamp; 109823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M Info.push_back({bytesCount, flags, timestamp}); 109996743b42576bb508cd0820e9503a7d82003a682bRam Mohan M if (maxBytesCount < bytesCount) maxBytesCount = bytesCount; 110023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M } 1101f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M eleInfo.close(); 110223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M 110396743b42576bb508cd0820e9503a7d82003a682bRam Mohan M // As the frame sizes are known ahead, use it to configure i/p buffer size 110496743b42576bb508cd0820e9503a7d82003a682bRam Mohan M maxBytesCount = ALIGN_POWER_OF_TWO(maxBytesCount, 10); 110596743b42576bb508cd0820e9503a7d82003a682bRam Mohan M status = setPortBufferSize(omxNode, kPortIndexInput, maxBytesCount); 110696743b42576bb508cd0820e9503a7d82003a682bRam Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 110796743b42576bb508cd0820e9503a7d82003a682bRam Mohan M 1108bf556d1b91f112405411a3655c582612fe060821Ram Mohan M // set port mode 1109bf556d1b91f112405411a3655c582612fe060821Ram Mohan M status = omxNode->setPortMode(kPortIndexInput, portMode[0]); 1110bf556d1b91f112405411a3655c582612fe060821Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1111bf556d1b91f112405411a3655c582612fe060821Ram Mohan M status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); 1112bf556d1b91f112405411a3655c582612fe060821Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1113bf556d1b91f112405411a3655c582612fe060821Ram Mohan M 111423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M // set Port Params 111523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M uint32_t nFrameWidth, nFrameHeight, xFramerate; 111623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight, 111723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M &xFramerate); 1118bf556d1b91f112405411a3655c582612fe060821Ram Mohan M // get default color format 1119bf556d1b91f112405411a3655c582612fe060821Ram Mohan M OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused; 1120bf556d1b91f112405411a3655c582612fe060821Ram Mohan M getDefaultColorFormat(omxNode, kPortIndexOutput, portMode[1], 1121bf556d1b91f112405411a3655c582612fe060821Ram Mohan M &eColorFormat); 1122bf556d1b91f112405411a3655c582612fe060821Ram Mohan M ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused); 1123bf556d1b91f112405411a3655c582612fe060821Ram Mohan M status = 1124bf556d1b91f112405411a3655c582612fe060821Ram Mohan M setVideoPortFormat(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, 1125bf556d1b91f112405411a3655c582612fe060821Ram Mohan M eColorFormat, xFramerate); 1126bf556d1b91f112405411a3655c582612fe060821Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 112723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, 112823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate); 1129ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 113023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M android::Vector<BufferInfo> iBuffer, oBuffer; 113123c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M 113223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M // set state to idle 11337bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle( 11347bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, 11357bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexOutput, portMode, true)); 113623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M // set state to executing 11377bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); 113823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M 113923c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M // request EOS for thumbnail 114023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M size_t i = 0; 114123c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M while (!(Info[i].flags & OMX_BUFFERFLAG_SYNCFRAME)) i++; 114223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M eleStream.open(mURL, std::ifstream::binary); 114323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M ASSERT_EQ(eleStream.is_open(), true); 11447bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(decodeNFrames( 11457bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, 11467bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexOutput, eleStream, &Info, 0, i + 1, portMode[1])); 114723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M eleStream.close(); 11487bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE( 11497bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, 11507bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexInput, kPortIndexOutput, portMode[1])); 11517bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(testEOS( 11527bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M omxNode, observer, &iBuffer, &oBuffer, false, eosFlag, portMode, 11537bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr)); 11547bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer, 11557bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexInput, kPortIndexOutput)); 115623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M EXPECT_GE(framesReceived, 1U); 115723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M framesReceived = 0; 115823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M timestampUs = 0; 115923c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M 116023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M eleStream.open(mURL, std::ifstream::binary); 116123c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M ASSERT_EQ(eleStream.is_open(), true); 11627bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(decodeNFrames( 11637bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, 11647bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexOutput, eleStream, &Info, 0, i + 1, portMode[1], false)); 116523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M eleStream.close(); 11667bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE( 11677bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, 11687bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexInput, kPortIndexOutput, portMode[1])); 11697bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(testEOS( 11707bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode, 11717bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr)); 11727bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer, 11737bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexInput, kPortIndexOutput)); 117423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M EXPECT_GE(framesReceived, 1U); 117523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M framesReceived = 0; 117623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M timestampUs = 0; 117723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M 1178a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M // set state to idle 11797bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE( 11807bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); 1181a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M // set state to executing 11827bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, 11837bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M &oBuffer, kPortIndexInput, 11847bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexOutput)); 1185a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M} 1186a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M 1187a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M// end of sequence test 1188a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan MTEST_F(VideoDecHidlTest, SimpleEOSTest) { 1189a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M description("Test End of stream"); 1190a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (disableTest) return; 1191a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M android::hardware::media::omx::V1_0::Status status; 1192a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M uint32_t kPortIndexInput = 0, kPortIndexOutput = 1; 1193a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M status = setRole(omxNode, gEnv->getRole().c_str()); 1194a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1195a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M OMX_PORT_PARAM_TYPE params; 1196a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms); 1197a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (status == ::android::hardware::media::omx::V1_0::Status::OK) { 1198a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M ASSERT_EQ(params.nPorts, 2U); 1199a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M kPortIndexInput = params.nStartPortNumber; 1200a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M kPortIndexOutput = kPortIndexInput + 1; 1201a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M } 1202a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M char mURL[512], info[512]; 1203a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M strcpy(mURL, gEnv->getRes().c_str()); 1204a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M strcpy(info, gEnv->getRes().c_str()); 1205a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M GetURLForComponent(compName, mURL, info); 1206a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M 1207a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M std::ifstream eleStream, eleInfo; 1208a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M 1209a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M eleInfo.open(info); 1210a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M ASSERT_EQ(eleInfo.is_open(), true); 1211a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M android::Vector<FrameData> Info; 121296743b42576bb508cd0820e9503a7d82003a682bRam Mohan M int bytesCount = 0, maxBytesCount = 0; 1213a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M uint32_t flags = 0; 1214a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M uint32_t timestamp = 0; 1215a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M while (1) { 1216a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (!(eleInfo >> bytesCount)) break; 1217a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M eleInfo >> flags; 1218a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M eleInfo >> timestamp; 1219a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M Info.push_back({bytesCount, flags, timestamp}); 122096743b42576bb508cd0820e9503a7d82003a682bRam Mohan M if (maxBytesCount < bytesCount) maxBytesCount = bytesCount; 1221a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M } 1222a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M eleInfo.close(); 1223a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M 122496743b42576bb508cd0820e9503a7d82003a682bRam Mohan M // As the frame sizes are known ahead, use it to configure i/p buffer size 122596743b42576bb508cd0820e9503a7d82003a682bRam Mohan M maxBytesCount = ALIGN_POWER_OF_TWO(maxBytesCount, 10); 122696743b42576bb508cd0820e9503a7d82003a682bRam Mohan M status = setPortBufferSize(omxNode, kPortIndexInput, maxBytesCount); 122796743b42576bb508cd0820e9503a7d82003a682bRam Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 122896743b42576bb508cd0820e9503a7d82003a682bRam Mohan M 1229bf556d1b91f112405411a3655c582612fe060821Ram Mohan M // set port mode 123017fa59b43161f4e92a8419e518f51a61fdf540efRam Mohan M portMode[0] = PortMode::PRESET_BYTE_BUFFER; 123117fa59b43161f4e92a8419e518f51a61fdf540efRam Mohan M portMode[1] = PortMode::PRESET_ANW_BUFFER; 1232bf556d1b91f112405411a3655c582612fe060821Ram Mohan M status = omxNode->setPortMode(kPortIndexInput, portMode[0]); 1233bf556d1b91f112405411a3655c582612fe060821Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1234bf556d1b91f112405411a3655c582612fe060821Ram Mohan M status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); 123517fa59b43161f4e92a8419e518f51a61fdf540efRam Mohan M if (status != ::android::hardware::media::omx::V1_0::Status::OK) { 123617fa59b43161f4e92a8419e518f51a61fdf540efRam Mohan M portMode[1] = PortMode::PRESET_BYTE_BUFFER; 123717fa59b43161f4e92a8419e518f51a61fdf540efRam Mohan M status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); 123817fa59b43161f4e92a8419e518f51a61fdf540efRam Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 123917fa59b43161f4e92a8419e518f51a61fdf540efRam Mohan M } 1240bf556d1b91f112405411a3655c582612fe060821Ram Mohan M 1241a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M // set Port Params 1242a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M uint32_t nFrameWidth, nFrameHeight, xFramerate; 1243a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight, 1244a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M &xFramerate); 1245bf556d1b91f112405411a3655c582612fe060821Ram Mohan M // get default color format 1246bf556d1b91f112405411a3655c582612fe060821Ram Mohan M OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused; 1247bf556d1b91f112405411a3655c582612fe060821Ram Mohan M getDefaultColorFormat(omxNode, kPortIndexOutput, portMode[1], 1248bf556d1b91f112405411a3655c582612fe060821Ram Mohan M &eColorFormat); 1249bf556d1b91f112405411a3655c582612fe060821Ram Mohan M ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused); 1250bf556d1b91f112405411a3655c582612fe060821Ram Mohan M status = 1251bf556d1b91f112405411a3655c582612fe060821Ram Mohan M setVideoPortFormat(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, 1252bf556d1b91f112405411a3655c582612fe060821Ram Mohan M eColorFormat, xFramerate); 1253bf556d1b91f112405411a3655c582612fe060821Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1254a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, 1255a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate); 1256ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 1257a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M android::Vector<BufferInfo> iBuffer, oBuffer; 1258a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M 1259a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M // set state to idle 12607bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle( 12617bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, 12627bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexOutput, portMode, true)); 1263a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M // set state to executing 12647bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); 1265a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M 126623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M // request EOS at the end 126723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M eleStream.open(mURL, std::ifstream::binary); 126823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M ASSERT_EQ(eleStream.is_open(), true); 12697bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, 12707bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexInput, kPortIndexOutput, 12717bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M eleStream, &Info, 0, (int)Info.size(), 12727bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M portMode[1], false)); 1273f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M eleStream.close(); 12747bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE( 12757bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer, 12767bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexInput, kPortIndexOutput, portMode[1])); 12777bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(testEOS( 12787bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M omxNode, observer, &iBuffer, &oBuffer, true, eosFlag, portMode, 12797bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M portReconfiguration, kPortIndexInput, kPortIndexOutput, nullptr)); 12807bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer, 12817bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexInput, kPortIndexOutput)); 128223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M framesReceived = 0; 128323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M timestampUs = 0; 128423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M 128523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M // set state to idle 12867bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE( 12877bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); 128823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M // set state to executing 12897bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, 12907bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M &oBuffer, kPortIndexInput, 12917bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexOutput)); 129223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M} 129323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M 129423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// test input/output port flush 129523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan MTEST_F(VideoDecHidlTest, FlushTest) { 129623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M description("Test Flush"); 1297a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (disableTest) return; 129823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M android::hardware::media::omx::V1_0::Status status; 129923c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M uint32_t kPortIndexInput = 0, kPortIndexOutput = 1; 130023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M status = setRole(omxNode, gEnv->getRole().c_str()); 130123c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 130223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M OMX_PORT_PARAM_TYPE params; 130323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms); 130423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M if (status == ::android::hardware::media::omx::V1_0::Status::OK) { 130523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M ASSERT_EQ(params.nPorts, 2U); 130623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M kPortIndexInput = params.nStartPortNumber; 130723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M kPortIndexOutput = kPortIndexInput + 1; 130823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M } 130923c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M char mURL[512], info[512]; 131023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M strcpy(mURL, gEnv->getRes().c_str()); 131123c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M strcpy(info, gEnv->getRes().c_str()); 131223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M GetURLForComponent(compName, mURL, info); 131323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M 131423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M std::ifstream eleStream, eleInfo; 131523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M 131623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M eleInfo.open(info); 131723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M ASSERT_EQ(eleInfo.is_open(), true); 131823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M android::Vector<FrameData> Info; 131996743b42576bb508cd0820e9503a7d82003a682bRam Mohan M int bytesCount = 0, maxBytesCount = 0; 132023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M uint32_t flags = 0; 132123c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M uint32_t timestamp = 0; 132223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M while (1) { 132323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M if (!(eleInfo >> bytesCount)) break; 132423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M eleInfo >> flags; 132523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M eleInfo >> timestamp; 132623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M Info.push_back({bytesCount, flags, timestamp}); 132796743b42576bb508cd0820e9503a7d82003a682bRam Mohan M if (maxBytesCount < bytesCount) maxBytesCount = bytesCount; 132823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M } 132923c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M eleInfo.close(); 133023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M 133196743b42576bb508cd0820e9503a7d82003a682bRam Mohan M // As the frame sizes are known ahead, use it to configure i/p buffer size 133296743b42576bb508cd0820e9503a7d82003a682bRam Mohan M maxBytesCount = ALIGN_POWER_OF_TWO(maxBytesCount, 10); 133396743b42576bb508cd0820e9503a7d82003a682bRam Mohan M status = setPortBufferSize(omxNode, kPortIndexInput, maxBytesCount); 133496743b42576bb508cd0820e9503a7d82003a682bRam Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 133596743b42576bb508cd0820e9503a7d82003a682bRam Mohan M 1336bf556d1b91f112405411a3655c582612fe060821Ram Mohan M // set port mode 1337bf556d1b91f112405411a3655c582612fe060821Ram Mohan M status = omxNode->setPortMode(kPortIndexInput, portMode[0]); 1338bf556d1b91f112405411a3655c582612fe060821Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1339bf556d1b91f112405411a3655c582612fe060821Ram Mohan M status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); 1340bf556d1b91f112405411a3655c582612fe060821Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1341bf556d1b91f112405411a3655c582612fe060821Ram Mohan M 134223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M // set Port Params 134323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M uint32_t nFrameWidth, nFrameHeight, xFramerate; 134423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M getInputChannelInfo(omxNode, kPortIndexInput, &nFrameWidth, &nFrameHeight, 134523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M &xFramerate); 1346bf556d1b91f112405411a3655c582612fe060821Ram Mohan M // get default color format 1347bf556d1b91f112405411a3655c582612fe060821Ram Mohan M OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused; 1348bf556d1b91f112405411a3655c582612fe060821Ram Mohan M getDefaultColorFormat(omxNode, kPortIndexOutput, portMode[1], 1349bf556d1b91f112405411a3655c582612fe060821Ram Mohan M &eColorFormat); 1350bf556d1b91f112405411a3655c582612fe060821Ram Mohan M ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused); 1351bf556d1b91f112405411a3655c582612fe060821Ram Mohan M status = 1352bf556d1b91f112405411a3655c582612fe060821Ram Mohan M setVideoPortFormat(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, 1353bf556d1b91f112405411a3655c582612fe060821Ram Mohan M eColorFormat, xFramerate); 1354bf556d1b91f112405411a3655c582612fe060821Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 135523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M setDefaultPortParam(omxNode, kPortIndexOutput, OMX_VIDEO_CodingUnused, 135623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M eColorFormat, nFrameWidth, nFrameHeight, 0, xFramerate); 135723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M 135823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M android::Vector<BufferInfo> iBuffer, oBuffer; 135923c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M 136023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M // set state to idle 13617bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle( 13627bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, 13637bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexOutput, portMode, true)); 136423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M // set state to executing 13657bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); 136623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M 136723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M // Decode 128 frames and flush. here 128 is chosen to ensure there is a key 136823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M // frame after this so that the below section can be convered for all 136923c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M // components 137023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M int nFrames = 128; 137123c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M eleStream.open(mURL, std::ifstream::binary); 137223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M ASSERT_EQ(eleStream.is_open(), true); 13737bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(decodeNFrames( 13747bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, 13757bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexOutput, eleStream, &Info, 0, nFrames, portMode[1], false)); 13767bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer, 13777bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexInput, kPortIndexOutput)); 137823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M framesReceived = 0; 137923c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M 138023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M // Seek to next key frame and start decoding till the end 138123c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M int index = nFrames; 138223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M bool keyFrame = false; 138323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M while (index < (int)Info.size()) { 138423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M if ((Info[index].flags & OMX_BUFFERFLAG_SYNCFRAME) == 138523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M OMX_BUFFERFLAG_SYNCFRAME) { 138623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M timestampUs = Info[index - 1].timestamp; 138723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M keyFrame = true; 138823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M break; 138923c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M } 139023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M eleStream.ignore(Info[index].bytesCount); 139123c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M index++; 139223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M } 139323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M if (keyFrame) { 13947bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE( 13957bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M decodeNFrames(omxNode, observer, &iBuffer, &oBuffer, 13967bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexInput, kPortIndexOutput, eleStream, &Info, 13977bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M index, Info.size() - index, portMode[1], false)); 139823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M } 1399285f8b116ec6381991a4e20a4a2fa58a2176b30bRam Mohan M eleStream.close(); 14007bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(flushPorts(omxNode, observer, &iBuffer, &oBuffer, 14017bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexInput, kPortIndexOutput)); 140223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M framesReceived = 0; 140323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M 140423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M // set state to idle 14057bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE( 14067bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); 140723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M // set state to executing 14087bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, 14097bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M &oBuffer, kPortIndexInput, 14107bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexOutput)); 1411f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M} 1412f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 1413f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Mint main(int argc, char** argv) { 1414f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M gEnv = new ComponentTestEnvironment(); 1415f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ::testing::AddGlobalTestEnvironment(gEnv); 1416f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ::testing::InitGoogleTest(&argc, argv); 1417303b2917d4928017fdd74ed2ffc4c805f696958dZhuoyao Zhang gEnv->init(&argc, argv); 1418f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M int status = gEnv->initFromOptions(argc, argv); 1419f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M if (status == 0) { 1420f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = RUN_ALL_TESTS(); 1421f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ALOGI("Test result = %d", status); 1422f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 1423f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M return status; 1424f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M} 1425