1527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M/* 2527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M * Copyright (C) 2017 The Android Open Source Project 3527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M * 4527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M * Licensed under the Apache License, Version 2.0 (the "License"); 5527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M * you may not use this file except in compliance with the License. 6527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M * You may obtain a copy of the License at 7527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M * 8527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M * http://www.apache.org/licenses/LICENSE-2.0 9527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M * 10527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M * Unless required by applicable law or agreed to in writing, software 11527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M * distributed under the License is distributed on an "AS IS" BASIS, 12527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M * See the License for the specific language governing permissions and 14527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M * limitations under the License. 15527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M */ 16527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 17527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M#define LOG_TAG "media_omx_hidl_component_test" 18527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M#include <android-base/logging.h> 19527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 20527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M#include <android/hardware/media/omx/1.0/IOmx.h> 21527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M#include <android/hardware/media/omx/1.0/IOmxNode.h> 22527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M#include <android/hardware/media/omx/1.0/IOmxObserver.h> 23527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M#include <android/hardware/media/omx/1.0/types.h> 24527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M#include <android/hidl/allocator/1.0/IAllocator.h> 25527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M#include <android/hidl/memory/1.0/IMapper.h> 26527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M#include <android/hidl/memory/1.0/IMemory.h> 27527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 28527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan Musing ::android::hardware::media::omx::V1_0::IOmx; 29527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan Musing ::android::hardware::media::omx::V1_0::IOmxObserver; 30527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan Musing ::android::hardware::media::omx::V1_0::IOmxNode; 31527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan Musing ::android::hardware::media::omx::V1_0::Message; 32527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan Musing ::android::hardware::media::omx::V1_0::CodecBuffer; 33ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan Musing ::android::hardware::media::omx::V1_0::PortMode; 34527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan Musing ::android::hidl::allocator::V1_0::IAllocator; 35527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan Musing ::android::hidl::memory::V1_0::IMemory; 36527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan Musing ::android::hidl::memory::V1_0::IMapper; 37527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan Musing ::android::hardware::Return; 38527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan Musing ::android::hardware::Void; 39527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan Musing ::android::hardware::hidl_vec; 40527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan Musing ::android::hardware::hidl_string; 41527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan Musing ::android::sp; 42527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 43527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M#include <VtsHalHidlTargetTestBase.h> 44527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M#include <getopt.h> 45527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M#include <media_hidl_test_common.h> 46527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 47527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M// A class for test environment setup 48527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan Mclass ComponentTestEnvironment : public ::testing::Environment { 49527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M public: 50527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M virtual void SetUp() {} 51527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M virtual void TearDown() {} 52527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 53527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ComponentTestEnvironment() : instance("default") {} 54527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 55527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M void setInstance(const char* _instance) { instance = _instance; } 56527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 57527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M void setComponent(const char* _component) { component = _component; } 58527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 59527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M void setRole(const char* _role) { role = _role; } 60527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 61527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M const hidl_string getInstance() const { return instance; } 62527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 63527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M const hidl_string getComponent() const { return component; } 64527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 65527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M const hidl_string getRole() const { return role; } 66527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 67527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M int initFromOptions(int argc, char** argv) { 68527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M static struct option options[] = { 69527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M {"instance", required_argument, 0, 'I'}, 70527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M {"component", required_argument, 0, 'C'}, 71527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M {"role", required_argument, 0, 'R'}, 72527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M {0, 0, 0, 0}}; 73527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 74527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M while (true) { 75527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M int index = 0; 7623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M int c = getopt_long(argc, argv, "I:C:R:", options, &index); 77527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (c == -1) { 78527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M break; 79527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 80527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 81527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M switch (c) { 82527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M case 'I': 83527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M setInstance(optarg); 84527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M break; 85527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M case 'C': 86527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M setComponent(optarg); 87527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M break; 88527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M case 'R': 89527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M setRole(optarg); 90527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M break; 91527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M case '?': 92527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M break; 93527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 94527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 95527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 96527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (optind < argc) { 97527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M fprintf(stderr, 98527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M "unrecognized option: %s\n\n" 99527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M "usage: %s <gtest options> <test options>\n\n" 100527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M "test options are:\n\n" 101527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M "-I, --instance: HAL instance to test\n" 102527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M "-C, --component: OMX component to test\n" 10323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M "-R, --Role: OMX component Role\n", 104527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M argv[optind ?: 1], argv[0]); 105527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M return 2; 106527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 107527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M return 0; 108527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 109527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 110527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M private: 111527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M hidl_string instance; 112527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M hidl_string component; 113527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M hidl_string role; 114527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M}; 115527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 116527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan Mstatic ComponentTestEnvironment* gEnv = nullptr; 117527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 11823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// generic component test fixture class 119527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan Mclass ComponentHidlTest : public ::testing::VtsHalHidlTargetTestBase { 120527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M public: 121527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M virtual void SetUp() override { 122a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M disableTest = false; 123527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M android::hardware::media::omx::V1_0::Status status; 124527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M omx = ::testing::VtsHalHidlTargetTestBase::getService<IOmx>( 125527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M gEnv->getInstance()); 126527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_NE(omx, nullptr); 12723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M observer = new CodecObserver(nullptr); 128527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_NE(observer, nullptr); 129a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (strncmp(gEnv->getComponent().c_str(), "OMX.", 4) != 0) 130a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M disableTest = true; 131527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M EXPECT_TRUE(omx->allocateNode( 132527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M gEnv->getComponent(), observer, 133527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M [&](android::hardware::media::omx::V1_0::Status _s, 134527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M sp<IOmxNode> const& _nl) { 135527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = _s; 136527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M this->omxNode = _nl; 137527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M }) 138527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M .isOk()); 139527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_NE(omxNode, nullptr); 140527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_NE(gEnv->getRole().empty(), true) << "Invalid Component Role"; 141527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M struct StringToClass { 142527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M const char* Class; 143527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M standardCompClass CompClass; 144527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M }; 145527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M const StringToClass kStringToClass[] = { 146527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M {"audio_decoder", audio_decoder}, 147527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M {"audio_encoder", audio_encoder}, 148527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M {"video_decoder", video_decoder}, 149527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M {"video_encoder", video_encoder}, 150527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M }; 151527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M const size_t kNumStringToClass = 152527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M sizeof(kStringToClass) / sizeof(kStringToClass[0]); 153527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M const char* pch; 154527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M char substring[OMX_MAX_STRINGNAME_SIZE]; 155527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M strcpy(substring, gEnv->getRole().c_str()); 156527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M pch = strchr(substring, '.'); 157527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_NE(pch, nullptr) << "Invalid Component Role"; 158527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M substring[pch - substring] = '\0'; 159527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M compClass = unknown_class; 160527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M for (size_t i = 0; i < kNumStringToClass; ++i) { 161527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (!strcasecmp(substring, kStringToClass[i].Class)) { 162527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M compClass = kStringToClass[i].CompClass; 163527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M break; 164527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 165527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 166a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (compClass == unknown_class) disableTest = true; 167f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M isSecure = false; 168f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M size_t suffixLen = strlen(".secure"); 169f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M if (strlen(gEnv->getComponent().c_str()) >= suffixLen) { 170f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M isSecure = 171f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M !strcmp(gEnv->getComponent().c_str() + 172f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M strlen(gEnv->getComponent().c_str()) - suffixLen, 173f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M ".secure"); 174f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M } 175a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (disableTest) std::cerr << "[ ] Warning ! Test Disabled\n"; 176527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 177527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 178527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M virtual void TearDown() override { 179527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (omxNode != nullptr) { 180527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M EXPECT_TRUE((omxNode->freeNode()).isOk()); 181527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M omxNode = nullptr; 182527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 183527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 184527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 185527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M enum standardCompClass { 186527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M audio_decoder, 187527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M audio_encoder, 188527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M video_decoder, 189527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M video_encoder, 190527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M unknown_class, 191527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M }; 192527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 193527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M sp<IOmx> omx; 194527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M sp<CodecObserver> observer; 195527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M sp<IOmxNode> omxNode; 196527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M standardCompClass compClass; 197f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M bool isSecure; 198a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M bool disableTest; 199f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 200f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M protected: 201f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M static void description(const std::string& description) { 202f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M RecordProperty("description", description); 203f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 204527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M}; 205527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 206f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M// Random Index used for monkey testing while get/set parameters 207527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M#define RANDOM_INDEX 1729 208527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 209f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan Mvoid initPortMode(PortMode* pm, bool isSecure, 210f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M ComponentHidlTest::standardCompClass compClass) { 211f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M pm[0] = PortMode::PRESET_BYTE_BUFFER; 212f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M pm[1] = PortMode::PRESET_BYTE_BUFFER; 213f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M if (isSecure) { 214f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M switch (compClass) { 215f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M case ComponentHidlTest::video_decoder: 216f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M pm[0] = PortMode::PRESET_SECURE_BUFFER; 217f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M break; 218f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M case ComponentHidlTest::video_encoder: 219f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M pm[1] = PortMode::PRESET_SECURE_BUFFER; 220f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M break; 221f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M default: 222f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M break; 223f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M } 224f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M } 225f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M return; 226f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M} 227f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M 22823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// get/set video component port format 229527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan MReturn<android::hardware::media::omx::V1_0::Status> setVideoPortFormat( 230527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M sp<IOmxNode> omxNode, OMX_U32 portIndex, 23123c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M OMX_VIDEO_CODINGTYPE eCompressionFormat, OMX_COLOR_FORMATTYPE eColorFormat, 23223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M OMX_U32 xFramerate) { 233527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M OMX_U32 index = 0; 234527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M OMX_VIDEO_PARAM_PORTFORMATTYPE portFormat; 23523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M std::vector<OMX_COLOR_FORMATTYPE> arrColorFormat; 23623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M std::vector<OMX_VIDEO_CODINGTYPE> arrCompressionFormat; 237527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M android::hardware::media::omx::V1_0::Status status; 238527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 239527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M while (1) { 240527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M portFormat.nIndex = index; 241527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = getPortParam(omxNode, OMX_IndexParamVideoPortFormat, portIndex, 242527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M &portFormat); 243527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (status != ::android::hardware::media::omx::V1_0::Status::OK) break; 24423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M if (eCompressionFormat == OMX_VIDEO_CodingUnused) 24523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M arrColorFormat.push_back(portFormat.eColorFormat); 246527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M else 24723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M arrCompressionFormat.push_back(portFormat.eCompressionFormat); 248527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M index++; 249527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (index == 512) { 250f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // enumerated way too many formats, highly unusual for this to 251f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // happen. 252527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M EXPECT_LE(index, 512U) 253527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M << "Expecting OMX_ErrorNoMore but not received"; 254527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M break; 255527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 256527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 257527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (!index) return status; 25823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M if (eCompressionFormat == OMX_VIDEO_CodingUnused) { 25923c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M for (index = 0; index < arrColorFormat.size(); index++) { 26023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M if (arrColorFormat[index] == eColorFormat) { 26123c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M portFormat.eColorFormat = arrColorFormat[index]; 262527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M break; 263527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 264527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 26523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M if (index == arrColorFormat.size()) { 266a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M ALOGE("setting default color format %x", (int)arrColorFormat[0]); 26723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M portFormat.eColorFormat = arrColorFormat[0]; 268527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 269527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M portFormat.eCompressionFormat = OMX_VIDEO_CodingUnused; 270527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } else { 27123c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M for (index = 0; index < arrCompressionFormat.size(); index++) { 27223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M if (arrCompressionFormat[index] == eCompressionFormat) { 27323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M portFormat.eCompressionFormat = arrCompressionFormat[index]; 274527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M break; 275527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 276527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 27723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M if (index == arrCompressionFormat.size()) { 278a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M ALOGE("setting default compression format %x", 279a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M (int)arrCompressionFormat[0]); 28023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M portFormat.eCompressionFormat = arrCompressionFormat[0]; 281527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 282527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M portFormat.eColorFormat = OMX_COLOR_FormatUnused; 283527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 284527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // In setParam call nIndex shall be ignored as per omx-il specification. 285527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // see how this holds up by corrupting nIndex 286527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M portFormat.nIndex = RANDOM_INDEX; 28723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M portFormat.xFramerate = xFramerate; 288527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = setPortParam(omxNode, OMX_IndexParamVideoPortFormat, portIndex, 289527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M &portFormat); 290527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M return status; 291527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M} 292527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 29323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// get/set audio component port format 294527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan MReturn<android::hardware::media::omx::V1_0::Status> setAudioPortFormat( 29523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M sp<IOmxNode> omxNode, OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE eEncoding) { 296527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M OMX_U32 index = 0; 297527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M OMX_AUDIO_PARAM_PORTFORMATTYPE portFormat; 29823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M std::vector<OMX_AUDIO_CODINGTYPE> arrEncoding; 299527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M android::hardware::media::omx::V1_0::Status status; 300527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 301527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M while (1) { 302527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M portFormat.nIndex = index; 303527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = getPortParam(omxNode, OMX_IndexParamAudioPortFormat, portIndex, 304527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M &portFormat); 305527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (status != ::android::hardware::media::omx::V1_0::Status::OK) break; 30623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M arrEncoding.push_back(portFormat.eEncoding); 307527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M index++; 308527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (index == 512) { 309f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // enumerated way too many formats, highly unusual for this to 310f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // happen. 311527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M EXPECT_LE(index, 512U) 312527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M << "Expecting OMX_ErrorNoMore but not received"; 313527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M break; 314527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 315527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 316527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (!index) return status; 31723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M for (index = 0; index < arrEncoding.size(); index++) { 31823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M if (arrEncoding[index] == eEncoding) { 31923c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M portFormat.eEncoding = arrEncoding[index]; 320527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M break; 321527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 322527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 32323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M if (index == arrEncoding.size()) { 324a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M ALOGE("setting default Port format %x", (int)arrEncoding[0]); 32523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M portFormat.eEncoding = arrEncoding[0]; 326527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 327527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // In setParam call nIndex shall be ignored as per omx-il specification. 328527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // see how this holds up by corrupting nIndex 329527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M portFormat.nIndex = RANDOM_INDEX; 330527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = setPortParam(omxNode, OMX_IndexParamAudioPortFormat, portIndex, 331527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M &portFormat); 332527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M return status; 333527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M} 334527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 335a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M// test dispatch message API call 336a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan MTEST_F(ComponentHidlTest, dispatchMsg) { 337a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M description("test dispatch message API call"); 338a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (disableTest) return; 339a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M android::hardware::media::omx::V1_0::Status status; 340a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M Message msgin, msgout; 341a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M 342a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M msgin.type = Message::Type::EVENT; 343f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M msgin.data.eventData.event = OMX_EventError; 344f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M msgin.data.eventData.data1 = 0xdeaf; 345f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M msgin.data.eventData.data2 = 0xd00d; 346f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M msgin.data.eventData.data3 = 0x01ce; 347f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M msgin.data.eventData.data4 = 0xfa11; 348a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M status = omxNode->dispatchMessage(msgin); 349a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 350a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M status = observer->dequeueMessage(&msgout, DEFAULT_TIMEOUT); 351f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M EXPECT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); 352f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M EXPECT_EQ(msgout.type, msgin.type); 353f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M EXPECT_EQ(msgout.data.eventData.event, msgin.data.eventData.event); 354f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M EXPECT_EQ(msgout.data.eventData.data1, msgin.data.eventData.data1); 355f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M EXPECT_EQ(msgout.data.eventData.data2, msgin.data.eventData.data2); 356f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M EXPECT_EQ(msgout.data.eventData.data3, msgin.data.eventData.data3); 357f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M EXPECT_EQ(msgout.data.eventData.data4, msgin.data.eventData.data4); 358a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M} 359a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M 36023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// set component role 361527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan MTEST_F(ComponentHidlTest, SetRole) { 362f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M description("Test Set Component Role"); 363a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (disableTest) return; 364527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M android::hardware::media::omx::V1_0::Status status; 365527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = setRole(omxNode, gEnv->getRole().c_str()); 366f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 367527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M} 368527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 36923c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// port indices enumeration 3702aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan MTEST_F(ComponentHidlTest, DISABLED_GetPortIndices) { 37123c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M description("Test Component on Mandatory Port Parameters (Port Indices)"); 372a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (disableTest) return; 373527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M android::hardware::media::omx::V1_0::Status status; 374527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M OMX_PORT_PARAM_TYPE params; 375527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 376527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = setRole(omxNode, gEnv->getRole().c_str()); 377527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 378527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 379f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // Get Number of Ports and their Indices for all Domains 380f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // (Audio/Video/Image/Other) 381527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // All standard OMX components shall support following OMX Index types 382527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = getParam(omxNode, OMX_IndexParamAudioInit, ¶ms); 383527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 384527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms); 385527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 386527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = getParam(omxNode, OMX_IndexParamImageInit, ¶ms); 387527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 388527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = getParam(omxNode, OMX_IndexParamOtherInit, ¶ms); 389527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 390527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M} 391527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 39223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// port format enumeration 3932aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan MTEST_F(ComponentHidlTest, DISABLED_EnumeratePortFormat) { 394f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M description("Test Component on Mandatory Port Parameters (Port Format)"); 395a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (disableTest) return; 396527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M android::hardware::media::omx::V1_0::Status status; 397527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M uint32_t kPortIndexInput = 0, kPortIndexOutput = 1; 398527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 399527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = setRole(omxNode, gEnv->getRole().c_str()); 400527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 401527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M OMX_PORT_PARAM_TYPE params; 402527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (compClass == audio_decoder || compClass == audio_encoder) { 403527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = getParam(omxNode, OMX_IndexParamAudioInit, ¶ms); 404527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } else { 405527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms); 406527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 407527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (status == ::android::hardware::media::omx::V1_0::Status::OK) { 408527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(params.nPorts, 2U); 409527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M kPortIndexInput = params.nStartPortNumber; 410527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M kPortIndexOutput = kPortIndexInput + 1; 411527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 412527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 41323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatYUV420Planar; 41423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M OMX_U32 xFramerate = 24U << 16; 415527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 416f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // Enumerate Port Format 417527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (compClass == audio_encoder) { 418527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = 419527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M setAudioPortFormat(omxNode, kPortIndexInput, OMX_AUDIO_CodingPCM); 420527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 421527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = setAudioPortFormat(omxNode, kPortIndexOutput, 422527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M OMX_AUDIO_CodingAutoDetect); 423527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 424527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } else if (compClass == audio_decoder) { 425527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = setAudioPortFormat(omxNode, kPortIndexInput, 426527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M OMX_AUDIO_CodingAutoDetect); 427527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 428527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = 429527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M setAudioPortFormat(omxNode, kPortIndexOutput, OMX_AUDIO_CodingPCM); 430527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 431527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } else if (compClass == video_encoder) { 432527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = 433527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M setVideoPortFormat(omxNode, kPortIndexInput, OMX_VIDEO_CodingUnused, 43423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M eColorFormat, xFramerate); 435527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 436527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = setVideoPortFormat(omxNode, kPortIndexOutput, 437527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M OMX_VIDEO_CodingAutoDetect, 438527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M OMX_COLOR_FormatUnused, 0U); 439527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 440527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } else { 441527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = setVideoPortFormat(omxNode, kPortIndexInput, 442527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M OMX_VIDEO_CodingAutoDetect, 443527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M OMX_COLOR_FormatUnused, 0U); 444527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 44523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M status = setVideoPortFormat(omxNode, kPortIndexOutput, 44623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M OMX_VIDEO_CodingUnused, eColorFormat, 44723c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M xFramerate); 448527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 449527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 450527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M} 451527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 45223c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// get/set default port settings of a component 4532aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan MTEST_F(ComponentHidlTest, DISABLED_SetDefaultPortParams) { 454f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M description( 455f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M "Test Component on Mandatory Port Parameters (Port Definition)"); 456a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (disableTest) return; 457527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M android::hardware::media::omx::V1_0::Status status; 458527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M uint32_t kPortIndexInput = 0, kPortIndexOutput = 1; 459527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 460527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = setRole(omxNode, gEnv->getRole().c_str()); 461527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 462527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M OMX_PORT_PARAM_TYPE params; 463527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (compClass == audio_decoder || compClass == audio_encoder) { 464527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = getParam(omxNode, OMX_IndexParamAudioInit, ¶ms); 465527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } else { 466527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms); 467527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 468527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (status == ::android::hardware::media::omx::V1_0::Status::OK) { 469527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(params.nPorts, 2U); 470527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M kPortIndexInput = params.nStartPortNumber; 471527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M kPortIndexOutput = kPortIndexInput + 1; 472527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 473527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 474f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M for (size_t i = kPortIndexInput; i < kPortIndexOutput; i++) { 475f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M OMX_PARAM_PORTDEFINITIONTYPE portDef; 476f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M status = 477f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M getPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef); 478f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 479f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M if (status == android::hardware::media::omx::V1_0::Status::OK) { 480f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M EXPECT_EQ(portDef.eDir, i - kPortIndexInput); // OMX_DirInput 481f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M EXPECT_EQ(portDef.bEnabled, OMX_TRUE); 482f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M EXPECT_EQ(portDef.bPopulated, OMX_FALSE); 483f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M EXPECT_GE(portDef.nBufferCountMin, 1U); 484f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M EXPECT_GE(portDef.nBufferCountActual, portDef.nBufferCountMin); 485f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M if (compClass == audio_encoder || compClass == audio_decoder) { 486f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M EXPECT_EQ(portDef.eDomain, OMX_PortDomainAudio); 487f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M } else if (compClass == video_encoder || 488f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M compClass == video_decoder) { 489f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M EXPECT_EQ(portDef.eDomain, OMX_PortDomainVideo); 490527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 491f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M OMX_PARAM_PORTDEFINITIONTYPE mirror = portDef; 492f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M 493f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M // nBufferCountActual >= nBufferCountMin 494f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M portDef.nBufferCountActual = portDef.nBufferCountMin - 1; 495f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M status = setPortParam(omxNode, OMX_IndexParamPortDefinition, i, 496f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M &portDef); 497f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M EXPECT_NE(status, 498f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M ::android::hardware::media::omx::V1_0::Status::OK); 499f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M 500f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M // Edit Read-Only fields. 501f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M portDef = mirror; 502f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M portDef.eDir = static_cast<OMX_DIRTYPE>(RANDOM_INDEX); 503f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef); 504f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M getPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef); 505f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M EXPECT_EQ(portDef.eDir, mirror.eDir); 506f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &mirror); 507f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M 508f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M portDef = mirror; 509f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M portDef.nBufferSize >>= 1; 510f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef); 511f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M getPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef); 512f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M EXPECT_EQ(portDef.nBufferSize, mirror.nBufferSize); 513f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &mirror); 514f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M 515f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M portDef = mirror; 516f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M portDef.nBufferCountMin += 1; 517f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef); 518f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M getPortParam(omxNode, OMX_IndexParamPortDefinition, i, &portDef); 519f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M EXPECT_EQ(portDef.nBufferCountMin, mirror.nBufferCountMin); 520f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M setPortParam(omxNode, OMX_IndexParamPortDefinition, i, &mirror); 521f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M 522f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M portDef = mirror; 523f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M portDef.nBufferCountActual += 1; 524f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M status = setPortParam(omxNode, OMX_IndexParamPortDefinition, i, 525f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M &portDef); 526f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M if (status == ::android::hardware::media::omx::V1_0::Status::OK) { 527f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M status = getPortParam(omxNode, OMX_IndexParamPortDefinition, i, 528f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M &portDef); 529f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M EXPECT_EQ(portDef.nBufferCountActual, 530f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M mirror.nBufferCountActual + 1); 53123c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M } 532527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 533f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M portDef = mirror; 534f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M portDef.nBufferSize = mirror.nBufferSize << 1; 535f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M status = setPortParam(omxNode, OMX_IndexParamPortDefinition, i, 536f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M &portDef); 537f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M if (status == ::android::hardware::media::omx::V1_0::Status::OK) { 538f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M status = getPortParam(omxNode, OMX_IndexParamPortDefinition, i, 539f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M &portDef); 540f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M if (portDef.nBufferSize != mirror.nBufferSize) { 541f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M std::cout 542f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M << "[ ] Warning ! Component input port does " 543f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M "not preserve Read-Only fields \n"; 544f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M } 54523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M } 546527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 547527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 548527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M} 549527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 55023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// populate port test 5512aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan MTEST_F(ComponentHidlTest, DISABLED_PopulatePort) { 552f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M description("Verify bPopulated field of a component port"); 553f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M if (disableTest || isSecure) return; 554527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M android::hardware::media::omx::V1_0::Status status; 555f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M OMX_U32 portBase = 0; 556527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 557527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = setRole(omxNode, gEnv->getRole().c_str()); 558527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 559527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M OMX_PORT_PARAM_TYPE params; 560527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (compClass == audio_decoder || compClass == audio_encoder) { 561527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = getParam(omxNode, OMX_IndexParamAudioInit, ¶ms); 562527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } else { 563527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms); 564527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 565527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (status == ::android::hardware::media::omx::V1_0::Status::OK) { 566527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(params.nPorts, 2U); 567f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M portBase = params.nStartPortNumber; 568527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 569527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 570f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M sp<IAllocator> allocator = IAllocator::getService("ashmem"); 571f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M EXPECT_NE(allocator.get(), nullptr); 572527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 573f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M OMX_PARAM_PORTDEFINITIONTYPE portDef; 574527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = 575f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M getPortParam(omxNode, OMX_IndexParamPortDefinition, portBase, &portDef); 576f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 577f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(portDef.bPopulated, OMX_FALSE); 578527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 579f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M android::Vector<BufferInfo> pBuffer; 580f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M pBuffer.clear(); 581f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M uint32_t nBufferSize = portDef.nBufferSize >> 1; 582527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 583f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M for (size_t i = 0; i < portDef.nBufferCountActual; i++) { 584f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M BufferInfo buffer; 585f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M buffer.owner = client; 586f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M buffer.omxBuffer.type = CodecBuffer::Type::SHARED_MEM; 587f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M buffer.omxBuffer.attr.preset.rangeOffset = 0; 588f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M buffer.omxBuffer.attr.preset.rangeLength = 0; 589f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M bool success = false; 590f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M allocator->allocate( 591f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M nBufferSize, 592f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M [&success, &buffer](bool _s, 593f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ::android::hardware::hidl_memory const& mem) { 594f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M success = _s; 595f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M buffer.omxBuffer.sharedMemory = mem; 596f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M }); 597f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(success, true); 598f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(buffer.omxBuffer.sharedMemory.size(), nBufferSize); 599527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 600f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M omxNode->useBuffer( 601f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M portBase, buffer.omxBuffer, 602f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M [&status, &buffer](android::hardware::media::omx::V1_0::Status _s, 603f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M uint32_t id) { 604f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = _s; 605f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M buffer.id = id; 606f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M }); 607f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M pBuffer.push(buffer); 608f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 609f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 610527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 611527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = 612f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M getPortParam(omxNode, OMX_IndexParamPortDefinition, portBase, &portDef); 613f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 614f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // A port is populated when all of the buffers indicated by 61523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M // nBufferCountActual with a size of at least nBufferSizehave been 61623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M // allocated on the port. 617f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(portDef.bPopulated, OMX_FALSE); 618f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M} 619527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 62023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// Flush test 621f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan MTEST_F(ComponentHidlTest, Flush) { 622f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M description("Test Flush"); 623a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (disableTest) return; 624f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M android::hardware::media::omx::V1_0::Status status; 625f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M uint32_t kPortIndexInput = 0, kPortIndexOutput = 1; 626f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M Message msg; 627527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 628f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = setRole(omxNode, gEnv->getRole().c_str()); 629f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 630f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M OMX_PORT_PARAM_TYPE params; 631f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M if (compClass == audio_decoder || compClass == audio_encoder) { 632f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = getParam(omxNode, OMX_IndexParamAudioInit, ¶ms); 633f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } else { 634f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms); 635527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 636f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M if (status == ::android::hardware::media::omx::V1_0::Status::OK) { 637f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(params.nPorts, 2U); 638f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M kPortIndexInput = params.nStartPortNumber; 639f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M kPortIndexOutput = kPortIndexInput + 1; 640527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 641527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 642f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M android::Vector<BufferInfo> iBuffer, oBuffer; 643527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 644f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M // set port mode 645f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M PortMode portMode[2]; 646f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M initPortMode(portMode, isSecure, compClass); 647f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M status = omxNode->setPortMode(kPortIndexInput, portMode[0]); 648f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 649f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); 650f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 651f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M 652f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // set state to idle 653f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, 654f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M kPortIndexInput, kPortIndexOutput, portMode); 655f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // set state to executing 656f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M changeStateIdletoExecute(omxNode, observer); 657f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // dispatch buffers 658f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M for (size_t i = 0; i < oBuffer.size(); i++) { 659f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M dispatchOutputBuffer(omxNode, &oBuffer, i, portMode[1]); 660527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 661f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // flush port 662f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, 663f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M kPortIndexOutput); 6642aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M // TODO: Sending empty input buffers is slightly tricky. 6652aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M // Components sometimes process input buffers even when output buffers are 6662aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M // not dispatched. For instance Parsing sequence header does not require 6672aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M // output buffers. In such instances sending 0 size input buffers might 6682aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M // make component to send error events. so lets skip this aspect of testing. 669f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // dispatch buffers 6702aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M // for (size_t i = 0; i < iBuffer.size(); i++) { 6712aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M // dispatchInputBuffer(omxNode, &iBuffer, i, 0, 0, 0, portMode[0]); 6722aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M // } 6732aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M // // flush ports 6742aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M // flushPorts(omxNode, observer, &iBuffer, &oBuffer, kPortIndexInput, 6752aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M // kPortIndexOutput); 676f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // set state to idle 677f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); 678f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // set state to loaded 679f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, 680f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M kPortIndexInput, kPortIndexOutput); 681f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M} 682527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 68323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// state transitions test 684f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan MTEST_F(ComponentHidlTest, StateTransitions) { 68523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M description("Test State Transitions Loaded<->Idle<->Execute"); 686a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (disableTest) return; 687f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M android::hardware::media::omx::V1_0::Status status; 688f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M uint32_t kPortIndexInput = 0, kPortIndexOutput = 1; 689f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M Message msg; 690527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 691f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = setRole(omxNode, gEnv->getRole().c_str()); 692f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 693f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M OMX_PORT_PARAM_TYPE params; 694f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M if (compClass == audio_decoder || compClass == audio_encoder) { 695f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = getParam(omxNode, OMX_IndexParamAudioInit, ¶ms); 696f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } else { 697f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms); 698f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 699f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M if (status == ::android::hardware::media::omx::V1_0::Status::OK) { 700f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(params.nPorts, 2U); 701f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M kPortIndexInput = params.nStartPortNumber; 702f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M kPortIndexOutput = kPortIndexInput + 1; 703527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 704527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 705f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M android::Vector<BufferInfo> iBuffer, oBuffer; 706527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 707f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M // set port mode 708f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M PortMode portMode[2]; 709f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M initPortMode(portMode, isSecure, compClass); 710f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M status = omxNode->setPortMode(kPortIndexInput, portMode[0]); 711f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 712f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); 713f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 714f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M 715f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // set state to idle 716f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, 717f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M kPortIndexInput, kPortIndexOutput, portMode); 718f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // set state to executing 719f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M changeStateIdletoExecute(omxNode, observer); 720f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // dispatch buffers 721f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M for (size_t i = 0; i < oBuffer.size(); i++) { 722f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M dispatchOutputBuffer(omxNode, &oBuffer, i, portMode[1]); 723527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 724f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // set state to idle 725f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); 7262aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M // // set state to executing 7272aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M // changeStateIdletoExecute(omxNode, observer); 7282aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M // // TODO: Sending empty input buffers is slightly tricky. 7292aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M // // dispatch buffers 7302aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M // for (size_t i = 0; i < iBuffer.size(); i++) { 7312aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M // dispatchInputBuffer(omxNode, &iBuffer, i, 0, 0, 0, portMode[0]); 7322aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M // } 7332aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M // // set state to idle 7342aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan M // changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); 735f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // set state to loaded 736f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, 737f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M kPortIndexInput, kPortIndexOutput); 738527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M} 739527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 74023c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// state transitions test - monkeying 7412aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan MTEST_F(ComponentHidlTest, DISABLED_StateTransitions_M) { 742f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M description("Test State Transitions monkeying"); 743f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M if (disableTest || isSecure) return; 744527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M android::hardware::media::omx::V1_0::Status status; 745527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M uint32_t kPortIndexInput = 0, kPortIndexOutput = 1; 746527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M Message msg; 747527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 748527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = setRole(omxNode, gEnv->getRole().c_str()); 749527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 750527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M OMX_PORT_PARAM_TYPE params; 751527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (compClass == audio_decoder || compClass == audio_encoder) { 752527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = getParam(omxNode, OMX_IndexParamAudioInit, ¶ms); 753527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } else { 754527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms); 755527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 756527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (status == ::android::hardware::media::omx::V1_0::Status::OK) { 757527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(params.nPorts, 2U); 758527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M kPortIndexInput = params.nStartPortNumber; 759527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M kPortIndexOutput = kPortIndexInput + 1; 760527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 761527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 762527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M android::Vector<BufferInfo> iBuffer, oBuffer; 763527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 764527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // set state to loaded ; receive error OMX_ErrorSameState 765527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = omxNode->sendCommand(toRawCommandType(OMX_CommandStateSet), 766527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M OMX_StateLoaded); 767527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M EXPECT_NE(status, android::hardware::media::omx::V1_0::Status::OK); 768527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 769527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // set state to executing ; receive error OMX_ErrorIncorrectStateTransition 770527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = omxNode->sendCommand(toRawCommandType(OMX_CommandStateSet), 771527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M OMX_StateExecuting); 772527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M EXPECT_NE(status, android::hardware::media::omx::V1_0::Status::OK); 773527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 774527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // set state to idle 775f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, 776f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M kPortIndexInput, kPortIndexOutput); 777527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 778527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // set state to idle ; receive error OMX_ErrorSameState 779527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = omxNode->sendCommand(toRawCommandType(OMX_CommandStateSet), 780527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M OMX_StateIdle); 781527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M EXPECT_NE(status, android::hardware::media::omx::V1_0::Status::OK); 782527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 783527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // set state to executing 784f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M changeStateIdletoExecute(omxNode, observer); 785527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 786527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // set state to executing ; receive error OMX_ErrorSameState 787527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = omxNode->sendCommand(toRawCommandType(OMX_CommandStateSet), 788527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M OMX_StateExecuting); 789527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M EXPECT_NE(status, android::hardware::media::omx::V1_0::Status::OK); 790527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 791527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // set state to Loaded ; receive error OMX_ErrorIncorrectStateTransition 792527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = omxNode->sendCommand(toRawCommandType(OMX_CommandStateSet), 793527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M OMX_StateLoaded); 794527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M EXPECT_NE(status, android::hardware::media::omx::V1_0::Status::OK); 795527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 796527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // set state to Idle 797f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer); 798527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 799527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // set state to Loaded 800f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M changeStateIdletoLoaded(omxNode, observer, &iBuffer, &oBuffer, 801f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M kPortIndexInput, kPortIndexOutput); 802527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M} 803527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 80423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// port enable disable test 8052aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan MTEST_F(ComponentHidlTest, DISABLED_PortEnableDisable_Loaded) { 806f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M description("Test Port Enable and Disable (Component State :: Loaded)"); 807a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (disableTest) return; 808527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M android::hardware::media::omx::V1_0::Status status; 809527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M OMX_U32 portBase = 0; 810527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M Message msg; 811527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = setRole(omxNode, gEnv->getRole().c_str()); 812527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 813527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M OMX_PORT_PARAM_TYPE params; 814527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (compClass == audio_decoder || compClass == audio_encoder) { 815527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = getParam(omxNode, OMX_IndexParamAudioInit, ¶ms); 816527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } else { 817527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms); 818527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 819527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (status == ::android::hardware::media::omx::V1_0::Status::OK) { 820527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(params.nPorts, 2U); 821527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M portBase = params.nStartPortNumber; 822527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 823527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 824527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M for (size_t i = portBase; i < portBase + 2; i++) { 825527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = 826527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M omxNode->sendCommand(toRawCommandType(OMX_CommandPortDisable), i); 827527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); 828527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT); 829527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); 830527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(msg.type, Message::Type::EVENT); 831527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (msg.data.eventData.event == OMX_EventCmdComplete) { 832527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(msg.data.eventData.data1, OMX_CommandPortDisable); 833527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(msg.data.eventData.data2, i); 834527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // If you can disable a port, then you should be able to enable it 835527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // as well 836527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = omxNode->sendCommand( 837527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M toRawCommandType(OMX_CommandPortEnable), i); 838527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); 839527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT); 840527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); 841527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(msg.type, Message::Type::EVENT); 842527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(msg.data.eventData.data1, OMX_CommandPortEnable); 843527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(msg.data.eventData.data2, i); 844527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } else if (msg.data.eventData.event == OMX_EventError) { 845a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M ALOGE("Port %d Disabling failed with error %d", (int)i, 846527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M (int)msg.data.eventData.event); 847527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } else { 848527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // something unexpected happened 849527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_TRUE(false); 850527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 851527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 852527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M} 853527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 85423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// port enable disable test 855527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan MTEST_F(ComponentHidlTest, PortEnableDisable_Idle) { 856f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M description("Test Port Enable and Disable (Component State :: Idle)"); 857a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (disableTest) return; 858527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M android::hardware::media::omx::V1_0::Status status; 859527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M uint32_t kPortIndexInput = 0, kPortIndexOutput = 1; 860527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M OMX_U32 portBase = 0; 861527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M Message msg; 862527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = setRole(omxNode, gEnv->getRole().c_str()); 863527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 864527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M OMX_PORT_PARAM_TYPE params; 865527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (compClass == audio_decoder || compClass == audio_encoder) { 866527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = getParam(omxNode, OMX_IndexParamAudioInit, ¶ms); 867527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } else { 868527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms); 869527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 870527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (status == ::android::hardware::media::omx::V1_0::Status::OK) { 871527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(params.nPorts, 2U); 872527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M portBase = params.nStartPortNumber; 873527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 874527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M kPortIndexInput = portBase; 875527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M kPortIndexOutput = portBase + 1; 876527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 877527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // Component State :: Idle 878527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M android::Vector<BufferInfo> pBuffer[2]; 879527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 880f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M // set port mode 881f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M PortMode portMode[2]; 882f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M initPortMode(portMode, isSecure, compClass); 883f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M status = omxNode->setPortMode(kPortIndexInput, portMode[0]); 884f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 885f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); 886f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 887f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M 888f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // set state to idle 889f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M changeStateLoadedtoIdle(omxNode, observer, &pBuffer[0], &pBuffer[1], 890f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M kPortIndexInput, kPortIndexOutput, portMode); 891527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 892527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M for (size_t i = portBase; i < portBase + 2; i++) { 893527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = 894527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M omxNode->sendCommand(toRawCommandType(OMX_CommandPortDisable), i); 895527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); 896527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 897527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, &pBuffer[0], 898527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M &pBuffer[1]); 899527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (status == android::hardware::media::omx::V1_0::Status::OK) { 900527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(msg.type, Message::Type::EVENT); 901527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (msg.data.eventData.event == OMX_EventCmdComplete) { 902527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // do not disable the port until all the buffers are freed 903527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_TRUE(false); 904527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } else if (msg.data.eventData.event == OMX_EventError) { 905a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M ALOGE("Port %d Disabling failed with error %d", (int)i, 906527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M (int)msg.data.eventData.event); 907527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } else { 908527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // something unexpected happened 909527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_TRUE(false); 910527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 911527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } else if (status == 912527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M android::hardware::media::omx::V1_0::Status::TIMED_OUT) { 913527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M for (size_t j = 0; j < pBuffer[i - portBase].size(); ++j) { 914527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = omxNode->freeBuffer(i, pBuffer[i - portBase][j].id); 915527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(status, 916527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M android::hardware::media::omx::V1_0::Status::OK); 917527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 918527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 919527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, 920527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M &pBuffer[0], &pBuffer[1]); 921527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); 922527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(msg.type, Message::Type::EVENT); 923527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(msg.data.eventData.event, OMX_EventCmdComplete); 924527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(msg.data.eventData.data1, OMX_CommandPortDisable); 925527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(msg.data.eventData.data2, i); 926527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 927527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // If you can disable a port, then you should be able to enable it 928527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // as well 929527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = omxNode->sendCommand( 930527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M toRawCommandType(OMX_CommandPortEnable), i); 931527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); 932527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 933527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // do not enable the port until all the buffers are supplied 934527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, 935527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M &pBuffer[0], &pBuffer[1]); 936527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(status, 937527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M android::hardware::media::omx::V1_0::Status::TIMED_OUT); 938527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 939f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M allocatePortBuffers(omxNode, &pBuffer[i - portBase], i, 940f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M portMode[i - portBase]); 941527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, 942527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M &pBuffer[0], &pBuffer[1]); 943527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); 944527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(msg.type, Message::Type::EVENT); 945527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(msg.data.eventData.data1, OMX_CommandPortEnable); 946527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(msg.data.eventData.data2, i); 947527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } else { 948527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // something unexpected happened 949527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_TRUE(false); 950527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 951527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 952f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 953f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // set state to Loaded 954f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M changeStateIdletoLoaded(omxNode, observer, &pBuffer[0], &pBuffer[1], 955f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M kPortIndexInput, kPortIndexOutput); 956527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M} 957527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 95823c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// port enable disable test 959527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan MTEST_F(ComponentHidlTest, PortEnableDisable_Execute) { 960f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M description("Test Port Enable and Disable (Component State :: Execute)"); 961a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (disableTest) return; 962527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M android::hardware::media::omx::V1_0::Status status; 963527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M uint32_t kPortIndexInput = 0, kPortIndexOutput = 1; 964527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M OMX_U32 portBase = 0; 965527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M Message msg; 966527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = setRole(omxNode, gEnv->getRole().c_str()); 967527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 968527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M OMX_PORT_PARAM_TYPE params; 969527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (compClass == audio_decoder || compClass == audio_encoder) { 970527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = getParam(omxNode, OMX_IndexParamAudioInit, ¶ms); 971527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } else { 972527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms); 973527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 974527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (status == ::android::hardware::media::omx::V1_0::Status::OK) { 975527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(params.nPorts, 2U); 976527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M portBase = params.nStartPortNumber; 977527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 978527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M kPortIndexInput = portBase; 979527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M kPortIndexOutput = portBase + 1; 980527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 981527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // Component State :: Idle 982527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M android::Vector<BufferInfo> pBuffer[2]; 983527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 984f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M // set port mode 985f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M PortMode portMode[2]; 986f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M initPortMode(portMode, isSecure, compClass); 987f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M status = omxNode->setPortMode(kPortIndexInput, portMode[0]); 988f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 989f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); 990f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 991f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M 992f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // set state to idle 993f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M changeStateLoadedtoIdle(omxNode, observer, &pBuffer[0], &pBuffer[1], 994f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M kPortIndexInput, kPortIndexOutput, portMode); 995527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 996f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // set state to executing 997f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M changeStateIdletoExecute(omxNode, observer); 998527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 999f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // dispatch buffers 1000f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M for (size_t i = 0; i < pBuffer[1].size(); i++) { 1001f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M dispatchOutputBuffer(omxNode, &pBuffer[1], i, portMode[1]); 1002527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 1003527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 1004527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M for (size_t i = portBase; i < portBase + 2; i++) { 1005527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = 1006527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M omxNode->sendCommand(toRawCommandType(OMX_CommandPortDisable), i); 1007527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); 1008527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 1009527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, &pBuffer[0], 1010527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M &pBuffer[1]); 1011527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (status == android::hardware::media::omx::V1_0::Status::OK) { 1012527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(msg.type, Message::Type::EVENT); 1013527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (msg.data.eventData.event == OMX_EventCmdComplete) { 1014527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // do not disable the port until all the buffers are freed 1015527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_TRUE(false); 1016527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } else if (msg.data.eventData.event == OMX_EventError) { 1017a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M ALOGE("Port %d Disabling failed with error %d", (int)i, 1018527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M (int)msg.data.eventData.event); 1019527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } else { 1020527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // something unexpected happened 1021527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_TRUE(false); 1022527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 1023527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } else if (status == 1024527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M android::hardware::media::omx::V1_0::Status::TIMED_OUT) { 1025527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M for (size_t j = 0; j < pBuffer[i - portBase].size(); ++j) { 1026527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // test if client got all its buffers back 1027527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M EXPECT_EQ(pBuffer[i - portBase][j].owner, client); 1028527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // free the buffers 1029527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = omxNode->freeBuffer(i, pBuffer[i - portBase][j].id); 1030527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(status, 1031527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M android::hardware::media::omx::V1_0::Status::OK); 1032527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 1033527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 1034527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, 1035527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M &pBuffer[0], &pBuffer[1]); 1036527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); 1037527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(msg.type, Message::Type::EVENT); 1038527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(msg.data.eventData.event, OMX_EventCmdComplete); 1039527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(msg.data.eventData.data1, OMX_CommandPortDisable); 1040527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(msg.data.eventData.data2, i); 1041527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 1042527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // If you can disable a port, then you should be able to enable it 1043527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // as well 1044527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = omxNode->sendCommand( 1045527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M toRawCommandType(OMX_CommandPortEnable), i); 1046527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); 1047527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 1048527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // do not enable the port until all the buffers are supplied 1049527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, 1050527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M &pBuffer[0], &pBuffer[1]); 1051527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(status, 1052527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M android::hardware::media::omx::V1_0::Status::TIMED_OUT); 1053527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 1054f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M allocatePortBuffers(omxNode, &pBuffer[i - portBase], i, 1055f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M portMode[i - portBase]); 1056527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT, 1057527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M &pBuffer[0], &pBuffer[1]); 1058527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); 1059527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(msg.type, Message::Type::EVENT); 1060527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(msg.data.eventData.data1, OMX_CommandPortEnable); 1061527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(msg.data.eventData.data2, i); 1062527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } else { 1063527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // something unexpected happened 1064527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_TRUE(false); 1065527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 1066527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 1067f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 1068f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // set state to Idle 1069f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M changeStateExecutetoIdle(omxNode, observer, &pBuffer[0], &pBuffer[1]); 1070f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 1071f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // set state to Loaded 1072f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M changeStateIdletoLoaded(omxNode, observer, &pBuffer[0], &pBuffer[1], 1073f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M kPortIndexInput, kPortIndexOutput); 1074527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M} 1075527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 107623c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// port enable disable test - monkeying 10772aedf7596d844d26673a156b755b6f6be9ec4b8bRam Mohan MTEST_F(ComponentHidlTest, DISABLED_PortEnableDisable_M) { 1078f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M description( 1079f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M "Test Port Enable and Disable Monkeying (Component State :: Loaded)"); 1080f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M if (disableTest || isSecure) return; 1081527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M android::hardware::media::omx::V1_0::Status status; 1082527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M OMX_U32 portBase = 0; 1083527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M Message msg; 1084527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = setRole(omxNode, gEnv->getRole().c_str()); 1085527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1086527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M OMX_PORT_PARAM_TYPE params; 1087527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (compClass == audio_decoder || compClass == audio_encoder) { 1088527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = getParam(omxNode, OMX_IndexParamAudioInit, ¶ms); 1089527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } else { 1090527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms); 1091527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 1092527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (status == ::android::hardware::media::omx::V1_0::Status::OK) { 1093527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(params.nPorts, 2U); 1094527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M portBase = params.nStartPortNumber; 1095527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 1096527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 1097527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // disable invalid port, expecting OMX_ErrorBadPortIndex 1098527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = omxNode->sendCommand(toRawCommandType(OMX_CommandPortDisable), 1099527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M RANDOM_INDEX); 1100527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_NE(status, android::hardware::media::omx::V1_0::Status::OK); 1101527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 1102527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // enable invalid port, expecting OMX_ErrorBadPortIndex 1103527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = omxNode->sendCommand(toRawCommandType(OMX_CommandPortEnable), 1104527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M RANDOM_INDEX); 1105527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_NE(status, android::hardware::media::omx::V1_0::Status::OK); 1106527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 1107527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // disable all ports 1108527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = 1109527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M omxNode->sendCommand(toRawCommandType(OMX_CommandPortDisable), OMX_ALL); 1110527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); 1111527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M for (size_t i = 0; i < 2; i++) { 1112527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT); 1113527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); 1114527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(msg.type, Message::Type::EVENT); 1115527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (msg.data.eventData.event == OMX_EventCmdComplete) { 1116527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(msg.data.eventData.data1, OMX_CommandPortDisable); 1117527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (msg.data.eventData.data2 != portBase || 1118527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M msg.data.eventData.data2 != portBase + 1) 1119527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M EXPECT_TRUE(false); 1120527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } else if (msg.data.eventData.event == OMX_EventError) { 1121a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M ALOGE("Port %d Disabling failed with error %d", (int)i, 1122527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M (int)msg.data.eventData.event); 1123527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } else { 1124527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // something unexpected happened 1125527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_TRUE(false); 1126527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 1127527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 1128527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 1129527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // enable all ports 1130527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = 1131527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M omxNode->sendCommand(toRawCommandType(OMX_CommandPortEnable), OMX_ALL); 1132527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); 1133527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M for (size_t i = 0; i < 2; i++) { 1134527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = observer->dequeueMessage(&msg, DEFAULT_TIMEOUT); 1135527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); 1136527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(msg.type, Message::Type::EVENT); 1137527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (msg.data.eventData.event == OMX_EventCmdComplete) { 1138527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_EQ(msg.data.eventData.data1, OMX_CommandPortEnable); 1139527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (msg.data.eventData.data2 != portBase || 1140527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M msg.data.eventData.data2 != portBase + 1) 1141527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M EXPECT_TRUE(false); 1142527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } else if (msg.data.eventData.event == OMX_EventError) { 1143a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M ALOGE("Port %d Enabling failed with error %d", (int)i, 1144527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M (int)msg.data.eventData.event); 1145527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } else { 1146527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M // something unexpected happened 1147527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ASSERT_TRUE(false); 1148527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 1149527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 1150527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M} 1151527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M 1152527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan Mint main(int argc, char** argv) { 1153527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M gEnv = new ComponentTestEnvironment(); 1154527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ::testing::AddGlobalTestEnvironment(gEnv); 1155527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ::testing::InitGoogleTest(&argc, argv); 1156527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M int status = gEnv->initFromOptions(argc, argv); 1157527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M if (status == 0) { 1158527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M status = RUN_ALL_TESTS(); 1159527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M ALOGI("Test result = %d", status); 1160527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M } 1161527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M return status; 1162527cf971592a0e06f30b7056374beb1a5257d2f7Ram Mohan M} 1163