1f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M/* 2f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M * Copyright (C) 2017 The Android Open Source Project 3f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M * 4f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M * Licensed under the Apache License, Version 2.0 (the "License"); 5f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M * you may not use this file except in compliance with the License. 6f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M * You may obtain a copy of the License at 7f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M * 8f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M * http://www.apache.org/licenses/LICENSE-2.0 9f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M * 10f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M * Unless required by applicable law or agreed to in writing, software 11f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M * distributed under the License is distributed on an "AS IS" BASIS, 12f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M * See the License for the specific language governing permissions and 14f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M * limitations under the License. 15f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M */ 16f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 17f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M#define LOG_TAG "media_omx_hidl_video_enc_test" 18a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M#ifdef __LP64__ 19a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M#define OMX_ANDROID_COMPILE_AS_32BIT_ON_64BIT_PLATFORMS 20a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M#endif 21a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M 22f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M#include <android-base/logging.h> 23f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 24ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M#include <android/hardware/graphics/bufferqueue/1.0/IGraphicBufferProducer.h> 25ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M#include <android/hardware/graphics/bufferqueue/1.0/IProducerListener.h> 26ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M#include <android/hardware/graphics/mapper/2.0/IMapper.h> 27ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M#include <android/hardware/graphics/mapper/2.0/types.h> 28ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M#include <android/hardware/media/omx/1.0/IGraphicBufferSource.h> 29f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M#include <android/hardware/media/omx/1.0/IOmx.h> 3092fb9ab603751d3743c2668835cf278d1509926dRam Mohan M#include <android/hardware/media/omx/1.0/IOmxBufferSource.h> 31f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M#include <android/hardware/media/omx/1.0/IOmxNode.h> 32f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M#include <android/hardware/media/omx/1.0/IOmxObserver.h> 33f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M#include <android/hardware/media/omx/1.0/types.h> 34f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M#include <android/hidl/allocator/1.0/IAllocator.h> 35f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M#include <android/hidl/memory/1.0/IMapper.h> 36f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M#include <android/hidl/memory/1.0/IMemory.h> 37f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 38ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan Musing ::android::hardware::graphics::bufferqueue::V1_0::IGraphicBufferProducer; 39ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan Musing ::android::hardware::graphics::bufferqueue::V1_0::IProducerListener; 40ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan Musing ::android::hardware::graphics::common::V1_0::BufferUsage; 41ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan Musing ::android::hardware::graphics::common::V1_0::PixelFormat; 42ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan Musing ::android::hardware::media::omx::V1_0::IGraphicBufferSource; 4392fb9ab603751d3743c2668835cf278d1509926dRam Mohan Musing ::android::hardware::media::omx::V1_0::IOmxBufferSource; 44f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Musing ::android::hardware::media::omx::V1_0::IOmx; 45f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Musing ::android::hardware::media::omx::V1_0::IOmxObserver; 46f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Musing ::android::hardware::media::omx::V1_0::IOmxNode; 47f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Musing ::android::hardware::media::omx::V1_0::Message; 48f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Musing ::android::hardware::media::omx::V1_0::CodecBuffer; 49ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan Musing ::android::hardware::media::omx::V1_0::PortMode; 50f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Musing ::android::hidl::allocator::V1_0::IAllocator; 51f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Musing ::android::hidl::memory::V1_0::IMemory; 52f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Musing ::android::hidl::memory::V1_0::IMapper; 53f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Musing ::android::hardware::Return; 54f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Musing ::android::hardware::Void; 55f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Musing ::android::hardware::hidl_vec; 56f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Musing ::android::hardware::hidl_string; 57f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Musing ::android::sp; 58f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 59f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M#include <VtsHalHidlTargetTestBase.h> 60f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M#include <getopt.h> 61a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M#include <media/hardware/HardwareAPI.h> 62f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M#include <media_hidl_test_common.h> 63f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M#include <media_video_hidl_test_common.h> 64ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M#include <system/window.h> 65f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M#include <fstream> 66f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 67f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Mstatic ComponentTestEnvironment* gEnv = nullptr; 68f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 6923c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// video encoder test fixture class 70f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Mclass VideoEncHidlTest : public ::testing::VtsHalHidlTargetTestBase { 71dd7e4c414b0e2bddf2bc3d2cbd7bc7f0aee03dedPawin Vongmasa private: 72dd7e4c414b0e2bddf2bc3d2cbd7bc7f0aee03dedPawin Vongmasa typedef ::testing::VtsHalHidlTargetTestBase Super; 73f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M public: 74dd7e4c414b0e2bddf2bc3d2cbd7bc7f0aee03dedPawin Vongmasa ::std::string getTestCaseInfo() const override { 75dd7e4c414b0e2bddf2bc3d2cbd7bc7f0aee03dedPawin Vongmasa return ::std::string() + 76dd7e4c414b0e2bddf2bc3d2cbd7bc7f0aee03dedPawin Vongmasa "Component: " + gEnv->getComponent().c_str() + " | " + 77dd7e4c414b0e2bddf2bc3d2cbd7bc7f0aee03dedPawin Vongmasa "Role: " + gEnv->getRole().c_str() + " | " + 78dd7e4c414b0e2bddf2bc3d2cbd7bc7f0aee03dedPawin Vongmasa "Instance: " + gEnv->getInstance().c_str() + " | " + 79dd7e4c414b0e2bddf2bc3d2cbd7bc7f0aee03dedPawin Vongmasa "Res: " + gEnv->getRes().c_str(); 80dd7e4c414b0e2bddf2bc3d2cbd7bc7f0aee03dedPawin Vongmasa } 81dd7e4c414b0e2bddf2bc3d2cbd7bc7f0aee03dedPawin Vongmasa 82f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M virtual void SetUp() override { 83dd7e4c414b0e2bddf2bc3d2cbd7bc7f0aee03dedPawin Vongmasa Super::SetUp(); 84a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M disableTest = false; 85f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M android::hardware::media::omx::V1_0::Status status; 86dd7e4c414b0e2bddf2bc3d2cbd7bc7f0aee03dedPawin Vongmasa omx = Super::getService<IOmx>(gEnv->getInstance()); 87f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_NE(omx, nullptr); 88ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M observer = 89ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M new CodecObserver([this](Message msg, const BufferInfo* buffer) { 90ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M handleMessage(msg, buffer); 91ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M }); 92f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_NE(observer, nullptr); 93a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (strncmp(gEnv->getComponent().c_str(), "OMX.", 4) != 0) 94a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M disableTest = true; 95f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M EXPECT_TRUE(omx->allocateNode( 96f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M gEnv->getComponent(), observer, 97f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M [&](android::hardware::media::omx::V1_0::Status _s, 98f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M sp<IOmxNode> const& _nl) { 99f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = _s; 100f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M this->omxNode = _nl; 101f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M }) 102f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M .isOk()); 10368df40f9cf3b8be9c9453b9468f73dc6e049ad20Ray Essick if (status == android::hardware::media::omx::V1_0::Status::NAME_NOT_FOUND) { 10468df40f9cf3b8be9c9453b9468f73dc6e049ad20Ray Essick disableTest = true; 10568df40f9cf3b8be9c9453b9468f73dc6e049ad20Ray Essick std::cout << "[ WARN ] Test Disabled, component not present\n"; 10668df40f9cf3b8be9c9453b9468f73dc6e049ad20Ray Essick return; 10768df40f9cf3b8be9c9453b9468f73dc6e049ad20Ray Essick } 1087bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 109f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_NE(omxNode, nullptr); 110f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_NE(gEnv->getRole().empty(), true) << "Invalid Component Role"; 111f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M struct StringToName { 112f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M const char* Name; 113f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M standardComp CompName; 114f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M }; 115f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M const StringToName kStringToName[] = { 116a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M {"h263", h263}, {"avc", avc}, {"mpeg4", mpeg4}, 117f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M {"hevc", hevc}, {"vp8", vp8}, {"vp9", vp9}, 118f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M }; 119f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M const size_t kNumStringToName = 120f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M sizeof(kStringToName) / sizeof(kStringToName[0]); 121f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M const char* pch; 122f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M char substring[OMX_MAX_STRINGNAME_SIZE]; 123f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M strcpy(substring, gEnv->getRole().c_str()); 124f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M pch = strchr(substring, '.'); 125f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_NE(pch, nullptr); 126f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M compName = unknown_comp; 127f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M for (size_t i = 0; i < kNumStringToName; ++i) { 128f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M if (!strcasecmp(pch + 1, kStringToName[i].Name)) { 129f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M compName = kStringToName[i].CompName; 130f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M break; 131f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 132f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 133a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (compName == unknown_comp) disableTest = true; 134f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M struct CompToCompression { 135f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M standardComp CompName; 136f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M OMX_VIDEO_CODINGTYPE eCompressionFormat; 137f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M }; 138f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M static const CompToCompression kCompToCompression[] = { 139f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M {h263, OMX_VIDEO_CodingH263}, {avc, OMX_VIDEO_CodingAVC}, 140a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M {mpeg4, OMX_VIDEO_CodingMPEG4}, {hevc, OMX_VIDEO_CodingHEVC}, 141a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M {vp8, OMX_VIDEO_CodingVP8}, {vp9, OMX_VIDEO_CodingVP9}, 142f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M }; 143f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M static const size_t kNumCompToCompression = 144f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M sizeof(kCompToCompression) / sizeof(kCompToCompression[0]); 145f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M size_t i; 146f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M for (i = 0; i < kNumCompToCompression; ++i) { 147f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M if (kCompToCompression[i].CompName == compName) { 148f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M eCompressionFormat = kCompToCompression[i].eCompressionFormat; 149f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M break; 150f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 151f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 152a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (i == kNumCompToCompression) disableTest = true; 153ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M eosFlag = false; 154ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M prependSPSPPS = false; 155ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M timestampDevTest = false; 156ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M producer = nullptr; 157ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M source = nullptr; 158ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M isSecure = false; 159ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M size_t suffixLen = strlen(".secure"); 160ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (strlen(gEnv->getComponent().c_str()) >= suffixLen) { 161f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M isSecure = 162f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M !strcmp(gEnv->getComponent().c_str() + 163f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M strlen(gEnv->getComponent().c_str()) - suffixLen, 164f0e839e0e72f87a8d92857e900ebdad2b2372ab3Ram Mohan M ".secure"); 165ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } 166ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (isSecure) disableTest = true; 1670a9ac2ac7881fb1db5cec5ddf67b5419379c4da1Ram Mohan M if (disableTest) std::cout << "[ WARN ] Test Disabled \n"; 168f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 169f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 170f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M virtual void TearDown() override { 171f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M if (omxNode != nullptr) { 172a0698429dd47e2f029866765c6980bc8720a7acbRam Mohan M // If you have encountered a fatal failure, it is possible that 173a0698429dd47e2f029866765c6980bc8720a7acbRam Mohan M // freeNode() will not go through. Instead of hanging the app. 174a0698429dd47e2f029866765c6980bc8720a7acbRam Mohan M // let it pass through and report errors 175a0698429dd47e2f029866765c6980bc8720a7acbRam Mohan M if (::testing::Test::HasFatalFailure()) return; 176f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M EXPECT_TRUE((omxNode->freeNode()).isOk()); 177f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M omxNode = nullptr; 178f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 179dd7e4c414b0e2bddf2bc3d2cbd7bc7f0aee03dedPawin Vongmasa Super::TearDown(); 180f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 181f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 182ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M // callback function to process messages received by onMessages() from IL 183ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M // client. 184ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M void handleMessage(Message msg, const BufferInfo* buffer) { 185ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M (void)buffer; 186ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 187ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (msg.type == Message::Type::FILL_BUFFER_DONE) { 188ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (msg.data.extendedBufferData.flags & OMX_BUFFERFLAG_EOS) { 189ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M eosFlag = true; 190ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } 191ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (msg.data.extendedBufferData.rangeLength != 0) { 192ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M // Test if current timestamp is among the list of queued 193ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M // timestamps 19479312c8aa214a72a653b65d7df9c3d68d3cabd86Ram Mohan M if (timestampDevTest && ((msg.data.extendedBufferData.flags & 195ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M OMX_BUFFERFLAG_CODECCONFIG) == 0)) { 196ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M bool tsHit = false; 197ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M android::List<uint64_t>::iterator it = 198ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M timestampUslist.begin(); 199ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M while (it != timestampUslist.end()) { 200ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (*it == msg.data.extendedBufferData.timestampUs) { 201ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M timestampUslist.erase(it); 202ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M tsHit = true; 203ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M break; 204ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } 205ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M it++; 206ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } 207ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (tsHit == false) { 208ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (timestampUslist.empty() == false) { 209ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M EXPECT_EQ(tsHit, true) 210ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M << "TimeStamp not recognized"; 211ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } else { 2120a9ac2ac7881fb1db5cec5ddf67b5419379c4da1Ram Mohan M std::cout << "[ INFO ] Received non-zero " 2130a9ac2ac7881fb1db5cec5ddf67b5419379c4da1Ram Mohan M "output / TimeStamp not recognized \n"; 214ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } 215ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } 216ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } 217ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M#define WRITE_OUTPUT 0 218ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M#if WRITE_OUTPUT 219ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M static int count = 0; 220ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M FILE* ofp = nullptr; 221ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (count) 222ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ofp = fopen("out.bin", "ab"); 223ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M else 224ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ofp = fopen("out.bin", "wb"); 225ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (ofp != nullptr) { 226ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M fwrite(static_cast<void*>(buffer->mMemory->getPointer()), 227ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M sizeof(char), 228ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M msg.data.extendedBufferData.rangeLength, ofp); 229ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M fclose(ofp); 230ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M count++; 231ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } 232ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M#endif 233ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } 234ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } 235ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } 236ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 237f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M enum standardComp { 238f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M h263, 239f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M avc, 240f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M mpeg4, 241f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M hevc, 242f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M vp8, 243f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M vp9, 244f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M unknown_comp, 245f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M }; 246f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 247f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M sp<IOmx> omx; 248f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M sp<CodecObserver> observer; 249f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M sp<IOmxNode> omxNode; 250f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M standardComp compName; 251f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M OMX_VIDEO_CODINGTYPE eCompressionFormat; 252a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M bool disableTest; 253ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M bool eosFlag; 254ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M bool prependSPSPPS; 255ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ::android::List<uint64_t> timestampUslist; 256ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M bool timestampDevTest; 257ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M bool isSecure; 258ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M sp<IGraphicBufferProducer> producer; 259ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M sp<IGraphicBufferSource> source; 260f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 261f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M protected: 262f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M static void description(const std::string& description) { 263f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M RecordProperty("description", description); 264f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 265f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M}; 266f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 267ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M// CodecProducerListener class 268ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan Mstruct CodecProducerListener : public IProducerListener { 269ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M public: 270ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M CodecProducerListener(int a, int b) 271ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M : freeBuffers(a), minUnDequeuedCount(b) {} 272ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M virtual ::android::hardware::Return<void> onBufferReleased() override { 273ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M android::Mutex::Autolock autoLock(bufferLock); 274ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M freeBuffers += 1; 275ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M return Void(); 276ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } 277ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M virtual ::android::hardware::Return<bool> needsReleaseNotify() override { 278ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M return true; 279ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } 280ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M void reduceCount() { 281ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M android::Mutex::Autolock autoLock(bufferLock); 282ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M freeBuffers -= 1; 283ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M EXPECT_GE(freeBuffers, minUnDequeuedCount); 284ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } 285ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 286ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M size_t freeBuffers; 287ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M size_t minUnDequeuedCount; 288ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M android::Mutex bufferLock; 289ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M}; 290ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 29192fb9ab603751d3743c2668835cf278d1509926dRam Mohan M// Mock IOmxBufferSource class. GraphicBufferSource.cpp in libstagefright/omx/ 29292fb9ab603751d3743c2668835cf278d1509926dRam Mohan M// implements this class. Below is dummy class introduced to test if callback 29392fb9ab603751d3743c2668835cf278d1509926dRam Mohan M// functions are actually being called or not 29492fb9ab603751d3743c2668835cf278d1509926dRam Mohan Mstruct DummyBufferSource : public IOmxBufferSource { 29592fb9ab603751d3743c2668835cf278d1509926dRam Mohan M public: 29692fb9ab603751d3743c2668835cf278d1509926dRam Mohan M DummyBufferSource(sp<IOmxNode> node) { 29792fb9ab603751d3743c2668835cf278d1509926dRam Mohan M callback = 0; 29892fb9ab603751d3743c2668835cf278d1509926dRam Mohan M executing = false; 29992fb9ab603751d3743c2668835cf278d1509926dRam Mohan M omxNode = node; 30092fb9ab603751d3743c2668835cf278d1509926dRam Mohan M } 30192fb9ab603751d3743c2668835cf278d1509926dRam Mohan M virtual Return<void> onOmxExecuting(); 30292fb9ab603751d3743c2668835cf278d1509926dRam Mohan M virtual Return<void> onOmxIdle(); 30392fb9ab603751d3743c2668835cf278d1509926dRam Mohan M virtual Return<void> onOmxLoaded(); 30492fb9ab603751d3743c2668835cf278d1509926dRam Mohan M virtual Return<void> onInputBufferAdded(uint32_t buffer); 30592fb9ab603751d3743c2668835cf278d1509926dRam Mohan M virtual Return<void> onInputBufferEmptied( 30692fb9ab603751d3743c2668835cf278d1509926dRam Mohan M uint32_t buffer, const ::android::hardware::hidl_handle& fence); 30792fb9ab603751d3743c2668835cf278d1509926dRam Mohan M 30892fb9ab603751d3743c2668835cf278d1509926dRam Mohan M int callback; 30992fb9ab603751d3743c2668835cf278d1509926dRam Mohan M bool executing; 31092fb9ab603751d3743c2668835cf278d1509926dRam Mohan M sp<IOmxNode> omxNode; 31192fb9ab603751d3743c2668835cf278d1509926dRam Mohan M android::Vector<BufferInfo> iBuffer, oBuffer; 31292fb9ab603751d3743c2668835cf278d1509926dRam Mohan M}; 31392fb9ab603751d3743c2668835cf278d1509926dRam Mohan M 31492fb9ab603751d3743c2668835cf278d1509926dRam Mohan MReturn<void> DummyBufferSource::onOmxExecuting() { 31592fb9ab603751d3743c2668835cf278d1509926dRam Mohan M executing = true; 31692fb9ab603751d3743c2668835cf278d1509926dRam Mohan M callback |= 0x1; 31792fb9ab603751d3743c2668835cf278d1509926dRam Mohan M size_t index; 31892fb9ab603751d3743c2668835cf278d1509926dRam Mohan M // Fetch a client owned input buffer and send an EOS 31992fb9ab603751d3743c2668835cf278d1509926dRam Mohan M if ((index = getEmptyBufferID(&iBuffer)) < iBuffer.size()) { 32092fb9ab603751d3743c2668835cf278d1509926dRam Mohan M android::hardware::media::omx::V1_0::Status status; 32192fb9ab603751d3743c2668835cf278d1509926dRam Mohan M CodecBuffer t = iBuffer[index].omxBuffer; 32292fb9ab603751d3743c2668835cf278d1509926dRam Mohan M t.type = CodecBuffer::Type::ANW_BUFFER; 32392fb9ab603751d3743c2668835cf278d1509926dRam Mohan M native_handle_t* fenceNh = native_handle_create(0, 0); 32492fb9ab603751d3743c2668835cf278d1509926dRam Mohan M EXPECT_NE(fenceNh, nullptr); 32592fb9ab603751d3743c2668835cf278d1509926dRam Mohan M status = omxNode->emptyBuffer(iBuffer[index].id, t, OMX_BUFFERFLAG_EOS, 32692fb9ab603751d3743c2668835cf278d1509926dRam Mohan M 0, fenceNh); 32792fb9ab603751d3743c2668835cf278d1509926dRam Mohan M native_handle_close(fenceNh); 32892fb9ab603751d3743c2668835cf278d1509926dRam Mohan M native_handle_delete(fenceNh); 32992fb9ab603751d3743c2668835cf278d1509926dRam Mohan M EXPECT_EQ(status, android::hardware::media::omx::V1_0::Status::OK); 33092fb9ab603751d3743c2668835cf278d1509926dRam Mohan M iBuffer.editItemAt(index).owner = component; 33192fb9ab603751d3743c2668835cf278d1509926dRam Mohan M } 33292fb9ab603751d3743c2668835cf278d1509926dRam Mohan M return Void(); 33392fb9ab603751d3743c2668835cf278d1509926dRam Mohan M}; 33492fb9ab603751d3743c2668835cf278d1509926dRam Mohan M 33592fb9ab603751d3743c2668835cf278d1509926dRam Mohan MReturn<void> DummyBufferSource::onOmxIdle() { 33692fb9ab603751d3743c2668835cf278d1509926dRam Mohan M callback |= 0x2; 33792fb9ab603751d3743c2668835cf278d1509926dRam Mohan M executing = false; 33892fb9ab603751d3743c2668835cf278d1509926dRam Mohan M return Void(); 33992fb9ab603751d3743c2668835cf278d1509926dRam Mohan M}; 34092fb9ab603751d3743c2668835cf278d1509926dRam Mohan M 34192fb9ab603751d3743c2668835cf278d1509926dRam Mohan MReturn<void> DummyBufferSource::onOmxLoaded() { 34292fb9ab603751d3743c2668835cf278d1509926dRam Mohan M callback |= 0x4; 34392fb9ab603751d3743c2668835cf278d1509926dRam Mohan M return Void(); 34492fb9ab603751d3743c2668835cf278d1509926dRam Mohan M}; 34592fb9ab603751d3743c2668835cf278d1509926dRam Mohan M 34692fb9ab603751d3743c2668835cf278d1509926dRam Mohan MReturn<void> DummyBufferSource::onInputBufferAdded(uint32_t buffer) { 34792fb9ab603751d3743c2668835cf278d1509926dRam Mohan M (void)buffer; 34892fb9ab603751d3743c2668835cf278d1509926dRam Mohan M EXPECT_EQ(executing, false); 34992fb9ab603751d3743c2668835cf278d1509926dRam Mohan M callback |= 0x8; 35092fb9ab603751d3743c2668835cf278d1509926dRam Mohan M return Void(); 35192fb9ab603751d3743c2668835cf278d1509926dRam Mohan M}; 35292fb9ab603751d3743c2668835cf278d1509926dRam Mohan M 35392fb9ab603751d3743c2668835cf278d1509926dRam Mohan MReturn<void> DummyBufferSource::onInputBufferEmptied( 35492fb9ab603751d3743c2668835cf278d1509926dRam Mohan M uint32_t buffer, const ::android::hardware::hidl_handle& fence) { 35592fb9ab603751d3743c2668835cf278d1509926dRam Mohan M (void)fence; 35692fb9ab603751d3743c2668835cf278d1509926dRam Mohan M callback |= 0x10; 35792fb9ab603751d3743c2668835cf278d1509926dRam Mohan M size_t i; 35892fb9ab603751d3743c2668835cf278d1509926dRam Mohan M for (i = 0; i < iBuffer.size(); i++) { 35992fb9ab603751d3743c2668835cf278d1509926dRam Mohan M if (iBuffer[i].id == buffer) { 36092fb9ab603751d3743c2668835cf278d1509926dRam Mohan M iBuffer.editItemAt(i).owner = client; 36192fb9ab603751d3743c2668835cf278d1509926dRam Mohan M break; 36292fb9ab603751d3743c2668835cf278d1509926dRam Mohan M } 36392fb9ab603751d3743c2668835cf278d1509926dRam Mohan M } 36492fb9ab603751d3743c2668835cf278d1509926dRam Mohan M return Void(); 36592fb9ab603751d3743c2668835cf278d1509926dRam Mohan M}; 36692fb9ab603751d3743c2668835cf278d1509926dRam Mohan M 367a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M// request VOP refresh 368a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan Mvoid requestIDR(sp<IOmxNode> omxNode, OMX_U32 portIndex) { 369a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M android::hardware::media::omx::V1_0::Status status; 370a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M OMX_CONFIG_INTRAREFRESHVOPTYPE param; 371a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M param.IntraRefreshVOP = OMX_TRUE; 372a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M status = setPortConfig(omxNode, OMX_IndexConfigVideoIntraVOPRefresh, 373a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M portIndex, ¶m); 374a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (status != ::android::hardware::media::omx::V1_0::Status::OK) 3750a9ac2ac7881fb1db5cec5ddf67b5419379c4da1Ram Mohan M std::cout << "[ INFO ] unable to request IDR \n"; 376a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M} 377a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M 378a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M// modify bitrate 379a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan Mvoid changeBitrate(sp<IOmxNode> omxNode, OMX_U32 portIndex, uint32_t nBitrate) { 380a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M android::hardware::media::omx::V1_0::Status status; 381a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M OMX_VIDEO_CONFIG_BITRATETYPE param; 382a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M param.nEncodeBitrate = nBitrate; 383a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M status = 384a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M setPortConfig(omxNode, OMX_IndexConfigVideoBitrate, portIndex, ¶m); 385a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (status != ::android::hardware::media::omx::V1_0::Status::OK) 3860a9ac2ac7881fb1db5cec5ddf67b5419379c4da1Ram Mohan M std::cout << "[ INFO ] unable to change Bitrate \n"; 387a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M} 388a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M 389a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M// modify framerate 390a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan MReturn<android::hardware::media::omx::V1_0::Status> changeFrameRate( 391a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M sp<IOmxNode> omxNode, OMX_U32 portIndex, uint32_t xFramerate) { 392a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M android::hardware::media::omx::V1_0::Status status; 393a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M OMX_CONFIG_FRAMERATETYPE param; 394a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M param.xEncodeFramerate = xFramerate; 395a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M status = setPortConfig(omxNode, OMX_IndexConfigVideoFramerate, portIndex, 396a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M ¶m); 397a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (status != ::android::hardware::media::omx::V1_0::Status::OK) 3980a9ac2ac7881fb1db5cec5ddf67b5419379c4da1Ram Mohan M std::cout << "[ INFO ] unable to change Framerate \n"; 399a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M return status; 400a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M} 401a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M 402a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M// modify intra refresh interval 403a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan Mvoid changeRefreshPeriod(sp<IOmxNode> omxNode, OMX_U32 portIndex, 404a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M uint32_t nRefreshPeriod) { 405a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M android::hardware::media::omx::V1_0::Status status; 406a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE param; 407a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M param.nRefreshPeriod = nRefreshPeriod; 408a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M status = setPortConfig(omxNode, 409a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M (OMX_INDEXTYPE)OMX_IndexConfigAndroidIntraRefresh, 410a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M portIndex, ¶m); 411a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (status != ::android::hardware::media::omx::V1_0::Status::OK) 4120a9ac2ac7881fb1db5cec5ddf67b5419379c4da1Ram Mohan M std::cout << "[ INFO ] unable to change Refresh Period\n"; 413a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M} 414a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M 415a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M// set intra refresh interval 416a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan Mvoid setRefreshPeriod(sp<IOmxNode> omxNode, OMX_U32 portIndex, 417a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M uint32_t nRefreshPeriod) { 418a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M android::hardware::media::omx::V1_0::Status status; 419a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M OMX_VIDEO_PARAM_INTRAREFRESHTYPE param; 420a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M param.eRefreshMode = OMX_VIDEO_IntraRefreshCyclic; 421a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M param.nCirMBs = 0; 422a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (nRefreshPeriod == 0) 423a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M param.nCirMBs = 0; 424a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M else { 425a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M OMX_PARAM_PORTDEFINITIONTYPE portDef; 426a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M status = getPortParam(omxNode, OMX_IndexParamPortDefinition, portIndex, 427a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M &portDef); 428a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (status == ::android::hardware::media::omx::V1_0::Status::OK) { 429a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M param.nCirMBs = 430a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M ((portDef.format.video.nFrameWidth + 15) >> 431a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M 4 * (portDef.format.video.nFrameHeight + 15) >> 4) / 432a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M nRefreshPeriod; 433a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M } 434a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M } 435a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M status = setPortParam(omxNode, OMX_IndexParamVideoIntraRefresh, portIndex, 436a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M ¶m); 437a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (status != ::android::hardware::media::omx::V1_0::Status::OK) 4380a9ac2ac7881fb1db5cec5ddf67b5419379c4da1Ram Mohan M std::cout << "[ INFO ] unable to set Refresh Period \n"; 439a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M} 440a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M 44192fb9ab603751d3743c2668835cf278d1509926dRam Mohan Mvoid setLatency(sp<IOmxNode> omxNode, OMX_U32 portIndex, uint32_t latency) { 44292fb9ab603751d3743c2668835cf278d1509926dRam Mohan M android::hardware::media::omx::V1_0::Status status; 44392fb9ab603751d3743c2668835cf278d1509926dRam Mohan M OMX_PARAM_U32TYPE param; 44492fb9ab603751d3743c2668835cf278d1509926dRam Mohan M param.nU32 = (OMX_U32)latency; 44592fb9ab603751d3743c2668835cf278d1509926dRam Mohan M status = setPortConfig(omxNode, (OMX_INDEXTYPE)OMX_IndexConfigLatency, 44692fb9ab603751d3743c2668835cf278d1509926dRam Mohan M portIndex, ¶m); 44792fb9ab603751d3743c2668835cf278d1509926dRam Mohan M if (status != ::android::hardware::media::omx::V1_0::Status::OK) 4480a9ac2ac7881fb1db5cec5ddf67b5419379c4da1Ram Mohan M std::cout << "[ INFO ] unable to set latency\n"; 44992fb9ab603751d3743c2668835cf278d1509926dRam Mohan M} 45092fb9ab603751d3743c2668835cf278d1509926dRam Mohan M 45192fb9ab603751d3743c2668835cf278d1509926dRam Mohan Mvoid getLatency(sp<IOmxNode> omxNode, OMX_U32 portIndex, uint32_t* latency) { 45292fb9ab603751d3743c2668835cf278d1509926dRam Mohan M android::hardware::media::omx::V1_0::Status status; 45392fb9ab603751d3743c2668835cf278d1509926dRam Mohan M OMX_PARAM_U32TYPE param; 45492fb9ab603751d3743c2668835cf278d1509926dRam Mohan M status = getPortConfig(omxNode, (OMX_INDEXTYPE)OMX_IndexConfigLatency, 45592fb9ab603751d3743c2668835cf278d1509926dRam Mohan M portIndex, ¶m); 45692fb9ab603751d3743c2668835cf278d1509926dRam Mohan M if (status != ::android::hardware::media::omx::V1_0::Status::OK) 4570a9ac2ac7881fb1db5cec5ddf67b5419379c4da1Ram Mohan M std::cout << "[ INFO ] unable to get latency\n"; 45892fb9ab603751d3743c2668835cf278d1509926dRam Mohan M else 45992fb9ab603751d3743c2668835cf278d1509926dRam Mohan M *latency = param.nU32; 46092fb9ab603751d3743c2668835cf278d1509926dRam Mohan M} 46192fb9ab603751d3743c2668835cf278d1509926dRam Mohan M 462f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M// Set Default port param. 463f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Mvoid setDefaultPortParam(sp<IOmxNode> omxNode, OMX_U32 portIndex, 464f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M OMX_VIDEO_CODINGTYPE eCompressionFormat, 465b7ae92bacbb83e3ca2c55efaa1ccb38422d4de8dRam Mohan M OMX_U32 nFrameWidth, OMX_U32 nFrameHeight, 466f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M OMX_U32 nBitrate, OMX_U32 xFramerate) { 467f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M android::hardware::media::omx::V1_0::Status status; 468f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M OMX_PARAM_PORTDEFINITIONTYPE portDef; 469f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = getPortParam(omxNode, OMX_IndexParamPortDefinition, portIndex, 470f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M &portDef); 471f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 472b7ae92bacbb83e3ca2c55efaa1ccb38422d4de8dRam Mohan M portDef.format.video.nFrameWidth = nFrameWidth; 473b7ae92bacbb83e3ca2c55efaa1ccb38422d4de8dRam Mohan M portDef.format.video.nFrameHeight = nFrameHeight; 474f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M portDef.format.video.nBitrate = nBitrate; 475f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M portDef.format.video.xFramerate = xFramerate; 476f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M portDef.format.video.bFlagErrorConcealment = OMX_TRUE; 477f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M portDef.format.video.eCompressionFormat = eCompressionFormat; 478f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M portDef.format.video.eColorFormat = OMX_COLOR_FormatUnused; 479f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = setPortParam(omxNode, OMX_IndexParamPortDefinition, portIndex, 480f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M &portDef); 481f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 482f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 483a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M std::vector<int32_t> arrProfile; 484a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M std::vector<int32_t> arrLevel; 485a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M enumerateProfileAndLevel(omxNode, portIndex, &arrProfile, &arrLevel); 486a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (arrProfile.empty() == true || arrLevel.empty() == true) 487a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M ASSERT_TRUE(false); 488a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M int32_t profile = arrProfile[0]; 489a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M int32_t level = arrLevel[0]; 490a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M 491f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M switch ((int)eCompressionFormat) { 492f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M case OMX_VIDEO_CodingAVC: 493a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M setupAVCPort(omxNode, portIndex, 494a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M static_cast<OMX_VIDEO_AVCPROFILETYPE>(profile), 495a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M static_cast<OMX_VIDEO_AVCLEVELTYPE>(level), 496a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M xFramerate); 497a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M break; 498a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M case OMX_VIDEO_CodingHEVC: 499a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M setupHEVCPort(omxNode, portIndex, 500a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M static_cast<OMX_VIDEO_HEVCPROFILETYPE>(profile), 501a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M static_cast<OMX_VIDEO_HEVCLEVELTYPE>(level)); 502a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M break; 503a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M case OMX_VIDEO_CodingH263: 504a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M setupH263Port(omxNode, portIndex, 505a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M static_cast<OMX_VIDEO_H263PROFILETYPE>(profile), 506a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M static_cast<OMX_VIDEO_H263LEVELTYPE>(level), 507a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M xFramerate); 508a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M break; 509a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M case OMX_VIDEO_CodingMPEG4: 510a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M setupMPEG4Port(omxNode, portIndex, 511a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M static_cast<OMX_VIDEO_MPEG4PROFILETYPE>(profile), 512a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M static_cast<OMX_VIDEO_MPEG4LEVELTYPE>(level), 513a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M xFramerate); 514a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M break; 515a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M case OMX_VIDEO_CodingVP8: 516a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M setupVPXPort(omxNode, portIndex, xFramerate); 517a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M setupVP8Port(omxNode, portIndex, 518a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M static_cast<OMX_VIDEO_VP8PROFILETYPE>(profile), 519a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M static_cast<OMX_VIDEO_VP8LEVELTYPE>(level)); 520a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M break; 521a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M case OMX_VIDEO_CodingVP9: 522a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M setupVPXPort(omxNode, portIndex, xFramerate); 523a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M setupVP9Port(omxNode, portIndex, 524a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M static_cast<OMX_VIDEO_VP9PROFILETYPE>(profile), 525a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M static_cast<OMX_VIDEO_VP9LEVELTYPE>(level)); 526f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M break; 527f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M default: 528f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M break; 529f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 530f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M} 531f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 532f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M// LookUpTable of clips and metadata for component testing 533a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan Mvoid GetURLForComponent(char* URL) { 534a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M strcat(URL, "bbb_352x288_420p_30fps_32frames.yuv"); 535f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M} 536f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 537ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M// blocking call to ensures application to Wait till all the inputs are consumed 538ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan Mvoid waitOnInputConsumption(sp<IOmxNode> omxNode, sp<CodecObserver> observer, 539ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M android::Vector<BufferInfo>* iBuffer, 540ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M android::Vector<BufferInfo>* oBuffer, 541ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M bool inputDataIsMeta = false, 542ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M sp<CodecProducerListener> listener = nullptr) { 543ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M android::hardware::media::omx::V1_0::Status status; 544ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M Message msg; 545df47955adf56dbf925763545a6f6036654d320afRam Mohan M int timeOut = TIMEOUT_COUNTER_Q; 546ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 547ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M while (timeOut--) { 548ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M size_t i = 0; 549ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M status = 550df47955adf56dbf925763545a6f6036654d320afRam Mohan M observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_Q, iBuffer, oBuffer); 5517bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_EQ(status, 552ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M android::hardware::media::omx::V1_0::Status::TIMED_OUT); 553ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M // status == TIMED_OUT, it could be due to process time being large 554ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M // than DEFAULT_TIMEOUT or component needs output buffers to start 555ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M // processing. 556ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (inputDataIsMeta) { 557ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (listener->freeBuffers == iBuffer->size()) break; 558ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } else { 559ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M for (; i < iBuffer->size(); i++) { 560ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if ((*iBuffer)[i].owner != client) break; 561ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } 562ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (i == iBuffer->size()) break; 563ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } 564ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 565ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M // Dispatch an output buffer assuming outQueue.empty() is true 566ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M size_t index; 567ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { 5687bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE( 5697bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M dispatchOutputBuffer(omxNode, oBuffer, index)); 570df47955adf56dbf925763545a6f6036654d320afRam Mohan M timeOut = TIMEOUT_COUNTER_Q; 571ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } 572ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } 573ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M} 574ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 575ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan Mint colorFormatConversion(BufferInfo* buffer, void* buff, PixelFormat format, 576ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M std::ifstream& eleStream) { 577ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M sp<android::hardware::graphics::mapper::V2_0::IMapper> mapper = 578ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M android::hardware::graphics::mapper::V2_0::IMapper::getService(); 579ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M EXPECT_NE(mapper.get(), nullptr); 580ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (mapper.get() == nullptr) return 1; 581ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 582ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M android::hardware::hidl_handle fence; 583ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M android::hardware::graphics::mapper::V2_0::IMapper::Rect rect; 584ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M android::hardware::graphics::mapper::V2_0::YCbCrLayout ycbcrLayout; 585ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M android::hardware::graphics::mapper::V2_0::Error error; 586ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M rect.left = 0; 587ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M rect.top = 0; 588ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M rect.width = buffer->omxBuffer.attr.anwBuffer.width; 589ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M rect.height = buffer->omxBuffer.attr.anwBuffer.height; 590ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 5912b7a309e25e796abe05450a15ab77e37fc517c5bRam Mohan M if (format == PixelFormat::YV12 || format == PixelFormat::YCRCB_420_SP || 5922b7a309e25e796abe05450a15ab77e37fc517c5bRam Mohan M format == PixelFormat::YCBCR_420_888) { 593ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M mapper->lockYCbCr( 594ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M buff, buffer->omxBuffer.attr.anwBuffer.usage, rect, fence, 595ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M [&](android::hardware::graphics::mapper::V2_0::Error _e, 596ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M android::hardware::graphics::mapper::V2_0::YCbCrLayout _n1) { 597ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M error = _e; 598ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ycbcrLayout = _n1; 599ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M }); 600ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M EXPECT_EQ(error, 601ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M android::hardware::graphics::mapper::V2_0::Error::NONE); 602ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (error != android::hardware::graphics::mapper::V2_0::Error::NONE) 603ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M return 1; 604ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 6051d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M int size = ((rect.width * rect.height * 3) >> 1); 6061d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M char* img = new char[size]; 6071d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M if (img == nullptr) return 1; 6081d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M eleStream.read(img, size); 6091d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M if (eleStream.gcount() != size) { 6101d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M delete[] img; 6111d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M return 1; 6121d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M } 6131d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M 6141d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M char* imgTmp = img; 615ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M char* ipBuffer = static_cast<char*>(ycbcrLayout.y); 616ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M for (size_t y = rect.height; y > 0; --y) { 6171d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M memcpy(ipBuffer, imgTmp, rect.width); 618ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ipBuffer += ycbcrLayout.yStride; 6191d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M imgTmp += rect.width; 620ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } 6212b7a309e25e796abe05450a15ab77e37fc517c5bRam Mohan M 6222b7a309e25e796abe05450a15ab77e37fc517c5bRam Mohan M if (format == PixelFormat::YV12) 6232b7a309e25e796abe05450a15ab77e37fc517c5bRam Mohan M EXPECT_EQ(ycbcrLayout.chromaStep, 1U); 6242b7a309e25e796abe05450a15ab77e37fc517c5bRam Mohan M else if (format == PixelFormat::YCRCB_420_SP) 6252b7a309e25e796abe05450a15ab77e37fc517c5bRam Mohan M EXPECT_EQ(ycbcrLayout.chromaStep, 2U); 6262b7a309e25e796abe05450a15ab77e37fc517c5bRam Mohan M 627ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ipBuffer = static_cast<char*>(ycbcrLayout.cb); 628ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M for (size_t y = rect.height >> 1; y > 0; --y) { 6292b7a309e25e796abe05450a15ab77e37fc517c5bRam Mohan M for (int32_t x = 0; x < (rect.width >> 1); ++x) { 6301d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M ipBuffer[ycbcrLayout.chromaStep * x] = *imgTmp++; 6312b7a309e25e796abe05450a15ab77e37fc517c5bRam Mohan M } 632ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ipBuffer += ycbcrLayout.cStride; 633ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } 634ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ipBuffer = static_cast<char*>(ycbcrLayout.cr); 635ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M for (size_t y = rect.height >> 1; y > 0; --y) { 6362b7a309e25e796abe05450a15ab77e37fc517c5bRam Mohan M for (int32_t x = 0; x < (rect.width >> 1); ++x) { 6371d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M ipBuffer[ycbcrLayout.chromaStep * x] = *imgTmp++; 6382b7a309e25e796abe05450a15ab77e37fc517c5bRam Mohan M } 639ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ipBuffer += ycbcrLayout.cStride; 640ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } 641ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 6421d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M delete[] img; 6431d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M 644ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M mapper->unlock(buff, 645ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M [&](android::hardware::graphics::mapper::V2_0::Error _e, 646ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M android::hardware::hidl_handle _n1) { 647ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M error = _e; 648ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M fence = _n1; 649ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M }); 650ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M EXPECT_EQ(error, 651ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M android::hardware::graphics::mapper::V2_0::Error::NONE); 652ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (error != android::hardware::graphics::mapper::V2_0::Error::NONE) 653ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M return 1; 65492fb9ab603751d3743c2668835cf278d1509926dRam Mohan M } else { 655ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M void* data; 656ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M mapper->lock(buff, buffer->omxBuffer.attr.anwBuffer.usage, rect, fence, 657ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M [&](android::hardware::graphics::mapper::V2_0::Error _e, 658ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M void* _n1) { 659ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M error = _e; 660ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M data = _n1; 661ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M }); 662ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M EXPECT_EQ(error, 663ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M android::hardware::graphics::mapper::V2_0::Error::NONE); 664ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (error != android::hardware::graphics::mapper::V2_0::Error::NONE) 665ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M return 1; 666ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 6672b7a309e25e796abe05450a15ab77e37fc517c5bRam Mohan M if (format == PixelFormat::BGRA_8888) { 66892fb9ab603751d3743c2668835cf278d1509926dRam Mohan M char* ipBuffer = static_cast<char*>(data); 66992fb9ab603751d3743c2668835cf278d1509926dRam Mohan M for (size_t y = rect.height; y > 0; --y) { 67092fb9ab603751d3743c2668835cf278d1509926dRam Mohan M eleStream.read(ipBuffer, rect.width * 4); 67192fb9ab603751d3743c2668835cf278d1509926dRam Mohan M if (eleStream.gcount() != rect.width * 4) return 1; 67292fb9ab603751d3743c2668835cf278d1509926dRam Mohan M ipBuffer += buffer->omxBuffer.attr.anwBuffer.stride * 4; 67392fb9ab603751d3743c2668835cf278d1509926dRam Mohan M } 67492fb9ab603751d3743c2668835cf278d1509926dRam Mohan M } else { 67592fb9ab603751d3743c2668835cf278d1509926dRam Mohan M EXPECT_TRUE(false) << "un expected pixel format"; 67692fb9ab603751d3743c2668835cf278d1509926dRam Mohan M return 1; 677ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } 678ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 679ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M mapper->unlock(buff, 680ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M [&](android::hardware::graphics::mapper::V2_0::Error _e, 681ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M android::hardware::hidl_handle _n1) { 682ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M error = _e; 683ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M fence = _n1; 684ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M }); 685ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M EXPECT_EQ(error, 686ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M android::hardware::graphics::mapper::V2_0::Error::NONE); 687ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (error != android::hardware::graphics::mapper::V2_0::Error::NONE) 688ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M return 1; 689ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } 690ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 691ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M return 0; 692ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M} 693ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 694ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan Mint fillGraphicBuffer(BufferInfo* buffer, PixelFormat format, 695ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M std::ifstream& eleStream) { 696ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M sp<android::hardware::graphics::mapper::V2_0::IMapper> mapper = 697ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M android::hardware::graphics::mapper::V2_0::IMapper::getService(); 698ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M EXPECT_NE(mapper.get(), nullptr); 699ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (mapper.get() == nullptr) return 1; 700ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 701ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M void* buff = nullptr; 702ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M android::hardware::graphics::mapper::V2_0::Error error; 703ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M mapper->importBuffer( 704ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M buffer->omxBuffer.nativeHandle, 705ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M [&](android::hardware::graphics::mapper::V2_0::Error _e, void* _n1) { 706ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M error = _e; 707ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M buff = _n1; 708ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M }); 709ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M EXPECT_EQ(error, android::hardware::graphics::mapper::V2_0::Error::NONE); 710ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (error != android::hardware::graphics::mapper::V2_0::Error::NONE) 711ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M return 1; 712ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 713ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (colorFormatConversion(buffer, buff, format, eleStream)) return 1; 714ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 715ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M error = mapper->freeBuffer(buff); 716ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M EXPECT_EQ(error, android::hardware::graphics::mapper::V2_0::Error::NONE); 717ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (error != android::hardware::graphics::mapper::V2_0::Error::NONE) 718ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M return 1; 719ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 720ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M return 0; 721ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M} 722ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 723ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan Mint dispatchGraphicBuffer(sp<IOmxNode> omxNode, 724ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M sp<IGraphicBufferProducer> producer, 725ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M sp<CodecProducerListener> listener, 726ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M android::Vector<BufferInfo>* buffArray, 727ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M OMX_U32 portIndex, std::ifstream& eleStream, 728ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M uint64_t timestamp) { 729ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M android::hardware::media::omx::V1_0::Status status; 730ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M OMX_PARAM_PORTDEFINITIONTYPE portDef; 731ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 732ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M status = getPortParam(omxNode, OMX_IndexParamPortDefinition, portIndex, 733ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M &portDef); 734ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 735ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (status != ::android::hardware::media::omx::V1_0::Status::OK) return 1; 736ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 737ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M enum { 738ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M // A flag returned by dequeueBuffer when the client needs to call 739ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M // requestBuffer immediately thereafter. 740ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M BUFFER_NEEDS_REALLOCATION = 0x1, 741ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M // A flag returned by dequeueBuffer when all mirrored slots should be 742ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M // released by the client. This flag should always be processed first. 743ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M RELEASE_ALL_BUFFERS = 0x2, 744ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M }; 745ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 746ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M int32_t slot; 747ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M int32_t result; 748ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ::android::hardware::hidl_handle fence; 749ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M IGraphicBufferProducer::FrameEventHistoryDelta outTimestamps; 750ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ::android::hardware::media::V1_0::AnwBuffer AnwBuffer; 7511d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M PixelFormat format = PixelFormat::YCBCR_420_888; 752ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M producer->dequeueBuffer( 753ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M portDef.format.video.nFrameWidth, portDef.format.video.nFrameHeight, 754ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M format, BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN, 755ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M true, [&](int32_t _s, int32_t const& _n1, 756ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ::android::hardware::hidl_handle const& _n2, 757ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M IGraphicBufferProducer::FrameEventHistoryDelta const& _n3) { 758ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M result = _s; 759ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M slot = _n1; 760ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M fence = _n2; 761ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M outTimestamps = _n3; 762ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M }); 763ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (result & BUFFER_NEEDS_REALLOCATION) { 764ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M producer->requestBuffer( 765ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M slot, [&](int32_t _s, 766ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ::android::hardware::media::V1_0::AnwBuffer const& _n1) { 767ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M result = _s; 768ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M AnwBuffer = _n1; 769ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M }); 770ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M EXPECT_EQ(result, 0); 771ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (result != 0) return 1; 772ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M size_t i; 773ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M for (i = 0; i < buffArray->size(); i++) { 774ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if ((*buffArray)[i].slot == -1) { 775ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M buffArray->editItemAt(i).slot = slot; 776ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M buffArray->editItemAt(i).omxBuffer.nativeHandle = 777ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M AnwBuffer.nativeHandle; 778ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M buffArray->editItemAt(i).omxBuffer.attr.anwBuffer = 779ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M AnwBuffer.attr; 780ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M break; 781ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } 782ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } 783ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M EXPECT_NE(i, buffArray->size()); 784ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (i == buffArray->size()) return 1; 785ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } 786ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M EXPECT_EQ(result, 0); 787ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (result != 0) return 1; 788ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 789ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M // fill Buffer 790ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M BufferInfo buffer; 791ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M size_t i; 792ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M for (i = 0; i < buffArray->size(); i++) { 793ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if ((*buffArray)[i].slot == slot) { 794ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M buffer = (*buffArray)[i]; 795ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M break; 796ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } 797ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } 798ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M EXPECT_NE(i, buffArray->size()); 799ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (i == buffArray->size()) return 1; 800ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (fillGraphicBuffer(&buffer, format, eleStream)) return 1; 801ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 802ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M // queue Buffer 803ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M IGraphicBufferProducer::QueueBufferOutput output; 804ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M IGraphicBufferProducer::QueueBufferInput input; 805ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M android::hardware::media::V1_0::Rect rect; 806ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M rect.left = 0; 807ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M rect.top = 0; 808ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M rect.right = buffer.omxBuffer.attr.anwBuffer.width; 809ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M rect.bottom = buffer.omxBuffer.attr.anwBuffer.height; 810ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M input.timestamp = timestamp; 811ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M input.isAutoTimestamp = false; 812ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M input.dataSpace = 813ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M android::hardware::graphics::common::V1_0::Dataspace::UNKNOWN; 814ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M input.crop = rect; 815ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M input.scalingMode = 0; 816ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M input.transform = 0; 817ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M input.stickyTransform = 0; 818ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M input.fence = android::hardware::hidl_handle(); 819ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M input.surfaceDamage = 820ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M android::hardware::hidl_vec<android::hardware::media::V1_0::Rect>{rect}; 821ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M input.getFrameTimestamps = false; 822ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M producer->queueBuffer( 823ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M buffer.slot, input, 824ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M [&](int32_t _s, const IGraphicBufferProducer::QueueBufferOutput& _n1) { 825ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M result = _s; 826ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M output = _n1; 827ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M }); 828ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M EXPECT_EQ(result, 0); 829ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (result != 0) return 1; 830ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 831ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M listener->reduceCount(); 832ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 833ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M return 0; 834ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M} 835ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 8361d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan Mint fillByteBuffer(sp<IOmxNode> omxNode, char* ipBuffer, OMX_U32 portIndexInput, 8371d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M std::ifstream& eleStream) { 8381d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M android::hardware::media::omx::V1_0::Status status; 8391d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M OMX_PARAM_PORTDEFINITIONTYPE portDef; 8401d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M uint32_t i, j; 8411d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M 8421d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M status = getPortParam(omxNode, OMX_IndexParamPortDefinition, portIndexInput, 8431d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M &portDef); 8441d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 8451d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M 8461d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M int size = ((portDef.format.video.nFrameWidth * 8471d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M portDef.format.video.nFrameHeight * 3) >> 8481d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M 1); 8491d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M char* img = new char[size]; 8501d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M if (img == nullptr) return 1; 8511d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M eleStream.read(img, size); 8521d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M if (eleStream.gcount() != size) { 8531d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M delete[] img; 8541d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M return 1; 8551d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M } 8561d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M 8571d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M char* Y = ipBuffer; 8581d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M char* imgTmp = img; 8591d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M for (j = 0; j < portDef.format.video.nFrameHeight; ++j) { 8601d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M memcpy(Y, imgTmp, portDef.format.video.nFrameWidth); 8611d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M Y += portDef.format.video.nStride; 8621d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M imgTmp += portDef.format.video.nFrameWidth; 8631d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M } 8641d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M 8651d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M if (portDef.format.video.eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar) { 8661d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M char* Cb = ipBuffer + (portDef.format.video.nFrameHeight * 8671d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M portDef.format.video.nStride); 8681d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M char* Cr = Cb + 1; 8691d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M for (j = 0; j<portDef.format.video.nFrameHeight>> 1; ++j) { 8701d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M for (i = 0; i < (portDef.format.video.nFrameWidth >> 1); ++i) { 8711d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M Cb[2 * i] = *imgTmp++; 8721d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M } 8731d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M Cb += portDef.format.video.nStride; 8741d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M } 8751d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M for (j = 0; j<portDef.format.video.nFrameHeight>> 1; ++j) { 8761d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M for (i = 0; i < (portDef.format.video.nFrameWidth >> 1); ++i) { 8771d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M Cr[2 * i] = *imgTmp++; 8781d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M } 8791d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M Cr += portDef.format.video.nStride; 8801d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M } 8811d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M } else if (portDef.format.video.eColorFormat == 8821d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M OMX_COLOR_FormatYUV420Planar) { 8831d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M char* Cb = ipBuffer + (portDef.format.video.nFrameHeight * 8841d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M portDef.format.video.nStride); 8851d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M char* Cr = Cb + ((portDef.format.video.nFrameHeight * 8861d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M portDef.format.video.nStride) >> 8871d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M 2); 8881d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M for (j = 0; j<portDef.format.video.nFrameHeight>> 1; ++j) { 8891d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M memcpy(Cb, imgTmp, (portDef.format.video.nFrameWidth >> 1)); 8901d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M Cb += (portDef.format.video.nStride >> 1); 8911d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M imgTmp += (portDef.format.video.nFrameWidth >> 1); 8921d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M } 8931d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M for (j = 0; j<portDef.format.video.nFrameHeight>> 1; ++j) { 8941d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M memcpy(Cr, imgTmp, (portDef.format.video.nFrameWidth >> 1)); 8951d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M Cr += (portDef.format.video.nStride >> 1); 8961d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M imgTmp += (portDef.format.video.nFrameWidth >> 1); 8971d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M } 8981d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M } 8991d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M 9001d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M delete[] img; 9011d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M return 0; 9021d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M} 9031d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M 904f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M// Encode N Frames 905f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Mvoid encodeNFrames(sp<IOmxNode> omxNode, sp<CodecObserver> observer, 906ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M OMX_U32 portIndexInput, OMX_U32 portIndexOutput, 907f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M android::Vector<BufferInfo>* iBuffer, 908f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M android::Vector<BufferInfo>* oBuffer, uint32_t nFrames, 909f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M uint32_t xFramerate, int bytesCount, 910ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M std::ifstream& eleStream, 911ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ::android::List<uint64_t>* timestampUslist = nullptr, 912ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M bool signalEOS = true, bool inputDataIsMeta = false, 913ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M sp<IGraphicBufferProducer> producer = nullptr, 914ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M sp<CodecProducerListener> listener = nullptr) { 915f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M android::hardware::media::omx::V1_0::Status status; 916f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M Message msg; 9170cf6b3df5ba7cb5bd56f88377401286f157cc7d9Ram Mohan M uint64_t timestamp = 0; 9180cf6b3df5ba7cb5bd56f88377401286f157cc7d9Ram Mohan M uint32_t flags = 0; 9190cf6b3df5ba7cb5bd56f88377401286f157cc7d9Ram Mohan M int timeOut = TIMEOUT_COUNTER_Q; 9200cf6b3df5ba7cb5bd56f88377401286f157cc7d9Ram Mohan M bool iQueued, oQueued; 921a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M 9220cf6b3df5ba7cb5bd56f88377401286f157cc7d9Ram Mohan M uint32_t ipCount = 0; 923a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (ipCount == 0) { 924a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M status = changeFrameRate(omxNode, portIndexOutput, (24U << 16)); 925a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (status == ::android::hardware::media::omx::V1_0::Status::OK) 926a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M xFramerate = (24U << 16); 927a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M } 928f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M int32_t timestampIncr = (int)((float)1000000 / (xFramerate >> 16)); 9290cf6b3df5ba7cb5bd56f88377401286f157cc7d9Ram Mohan M if (inputDataIsMeta) timestampIncr *= 1000; // timestamp scale: Nano sec 930f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 931f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M while (1) { 932df47955adf56dbf925763545a6f6036654d320afRam Mohan M iQueued = oQueued = false; 933f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = 934df47955adf56dbf925763545a6f6036654d320afRam Mohan M observer->dequeueMessage(&msg, DEFAULT_TIMEOUT_Q, iBuffer, oBuffer); 9350cf6b3df5ba7cb5bd56f88377401286f157cc7d9Ram Mohan M // Port Reconfiguration 936a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (status == android::hardware::media::omx::V1_0::Status::OK) { 937a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M ASSERT_EQ(msg.type, Message::Type::EVENT); 938a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (msg.data.eventData.event == OMX_EventPortSettingsChanged) { 939a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M ASSERT_EQ(msg.data.eventData.data1, portIndexOutput); 940a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M ASSERT_EQ(msg.data.eventData.data2, 941a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M OMX_IndexConfigAndroidIntraRefresh); 942ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } else if (msg.data.eventData.event == OMX_EventError) { 9437bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_TRUE(false) << "Received OMX_EventError, not sure why"; 944b7ae92bacbb83e3ca2c55efaa1ccb38422d4de8dRam Mohan M } else if (msg.data.eventData.event == OMX_EventDataSpaceChanged) { 945b7ae92bacbb83e3ca2c55efaa1ccb38422d4de8dRam Mohan M // TODO: how am i supposed to respond now? 9460a9ac2ac7881fb1db5cec5ddf67b5419379c4da1Ram Mohan M std::cout << "[ INFO ] OMX_EventDataSpaceChanged \n"; 947a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M } else { 948a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M ASSERT_TRUE(false); 949a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M } 950a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M } 951f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 952f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M if (nFrames == 0) break; 953f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 954f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // Dispatch input buffer 955f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M size_t index = 0; 956ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (inputDataIsMeta) { 957ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (listener->freeBuffers > listener->minUnDequeuedCount) { 958ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (dispatchGraphicBuffer(omxNode, producer, listener, iBuffer, 9597bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M portIndexInput, eleStream, 9607bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M timestamp)) { 9617bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M if (::testing::Test::HasFailure()) 9627bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_TRUE(false); 9637bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M else 9647bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M break; 9657bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M } 966ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M timestamp += timestampIncr; 967ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M nFrames--; 968ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ipCount++; 969df47955adf56dbf925763545a6f6036654d320afRam Mohan M iQueued = true; 970ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } 971ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } else { 972ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if ((index = getEmptyBufferID(iBuffer)) < iBuffer->size()) { 973ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M char* ipBuffer = static_cast<char*>(static_cast<void*>( 974ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M (*iBuffer)[index].mMemory->getPointer())); 975ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ASSERT_LE( 976ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M bytesCount, 977ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M static_cast<int>((*iBuffer)[index].mMemory->getSize())); 9781d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M if (fillByteBuffer(omxNode, ipBuffer, portIndexInput, 9791d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M eleStream)) 9801d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M break; 9810cf6b3df5ba7cb5bd56f88377401286f157cc7d9Ram Mohan M flags = OMX_BUFFERFLAG_ENDOFFRAME; 9820cf6b3df5ba7cb5bd56f88377401286f157cc7d9Ram Mohan M if (signalEOS && (nFrames == 1)) flags |= OMX_BUFFERFLAG_EOS; 9837bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(dispatchInputBuffer( 9847bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M omxNode, iBuffer, index, bytesCount, flags, timestamp)); 985ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (timestampUslist) timestampUslist->push_back(timestamp); 986ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M timestamp += timestampIncr; 987ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M nFrames--; 988ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ipCount++; 989df47955adf56dbf925763545a6f6036654d320afRam Mohan M iQueued = true; 990ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } 991f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 9920cf6b3df5ba7cb5bd56f88377401286f157cc7d9Ram Mohan M // Dispatch output buffer 993f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M if ((index = getEmptyBufferID(oBuffer)) < oBuffer->size()) { 9947bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE( 9957bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M dispatchOutputBuffer(omxNode, oBuffer, index)); 996df47955adf56dbf925763545a6f6036654d320afRam Mohan M oQueued = true; 997df47955adf56dbf925763545a6f6036654d320afRam Mohan M } 9980cf6b3df5ba7cb5bd56f88377401286f157cc7d9Ram Mohan M // Reset Counters when either input or output buffer is dispatched 999df47955adf56dbf925763545a6f6036654d320afRam Mohan M if (iQueued || oQueued) 1000df47955adf56dbf925763545a6f6036654d320afRam Mohan M timeOut = TIMEOUT_COUNTER_Q; 1001ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M else 1002df47955adf56dbf925763545a6f6036654d320afRam Mohan M timeOut--; 1003ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (timeOut == 0) { 10047bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_TRUE(false) << "Wait on Input/Output is found indefinite"; 1005f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 10060cf6b3df5ba7cb5bd56f88377401286f157cc7d9Ram Mohan M // Runtime Param Configuration 1007a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (ipCount == 15) { 1008a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M changeBitrate(omxNode, portIndexOutput, 768000); 1009a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M requestIDR(omxNode, portIndexOutput); 1010a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M changeRefreshPeriod(omxNode, portIndexOutput, 15); 1011a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M } 1012f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 1013f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M} 1014f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 101523c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// set component role 1016f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan MTEST_F(VideoEncHidlTest, SetRole) { 1017f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M description("Test Set Component Role"); 1018a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (disableTest) return; 1019f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M android::hardware::media::omx::V1_0::Status status; 1020f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = setRole(omxNode, gEnv->getRole().c_str()); 1021f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1022f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M} 1023f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 102423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M// port format enumeration 1025f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan MTEST_F(VideoEncHidlTest, EnumeratePortFormat) { 1026f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M description("Test Component on Mandatory Port Parameters (Port Format)"); 1027a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (disableTest) return; 1028f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M android::hardware::media::omx::V1_0::Status status; 1029f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M uint32_t kPortIndexInput = 0, kPortIndexOutput = 1; 1030f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatYUV420Planar; 1031f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M OMX_U32 xFramerate = (30U << 16); 1032f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = setRole(omxNode, gEnv->getRole().c_str()); 1033f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1034f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M OMX_PORT_PARAM_TYPE params; 1035f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms); 1036f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M if (status == ::android::hardware::media::omx::V1_0::Status::OK) { 1037f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(params.nPorts, 2U); 1038f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M kPortIndexInput = params.nStartPortNumber; 1039f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M kPortIndexOutput = kPortIndexInput + 1; 1040f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 1041f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = 1042f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M setVideoPortFormat(omxNode, kPortIndexInput, OMX_VIDEO_CodingUnused, 1043f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M eColorFormat, xFramerate); 1044f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1045f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 1046f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = setVideoPortFormat(omxNode, kPortIndexOutput, eCompressionFormat, 1047f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M OMX_COLOR_FormatUnused, 0U); 1048f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1049f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M} 1050f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 105192fb9ab603751d3743c2668835cf278d1509926dRam Mohan M// Test IOmxBufferSource CallBacks 105292fb9ab603751d3743c2668835cf278d1509926dRam Mohan MTEST_F(VideoEncHidlTest, BufferSourceCallBacks) { 105392fb9ab603751d3743c2668835cf278d1509926dRam Mohan M description("Test IOmxBufferSource CallBacks"); 105492fb9ab603751d3743c2668835cf278d1509926dRam Mohan M if (disableTest) return; 105592fb9ab603751d3743c2668835cf278d1509926dRam Mohan M android::hardware::media::omx::V1_0::Status status; 105692fb9ab603751d3743c2668835cf278d1509926dRam Mohan M uint32_t kPortIndexInput = 0, kPortIndexOutput = 1; 105792fb9ab603751d3743c2668835cf278d1509926dRam Mohan M status = setRole(omxNode, gEnv->getRole().c_str()); 105892fb9ab603751d3743c2668835cf278d1509926dRam Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 105992fb9ab603751d3743c2668835cf278d1509926dRam Mohan M OMX_PORT_PARAM_TYPE params; 106092fb9ab603751d3743c2668835cf278d1509926dRam Mohan M status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms); 106192fb9ab603751d3743c2668835cf278d1509926dRam Mohan M if (status == ::android::hardware::media::omx::V1_0::Status::OK) { 106292fb9ab603751d3743c2668835cf278d1509926dRam Mohan M ASSERT_EQ(params.nPorts, 2U); 106392fb9ab603751d3743c2668835cf278d1509926dRam Mohan M kPortIndexInput = params.nStartPortNumber; 106492fb9ab603751d3743c2668835cf278d1509926dRam Mohan M kPortIndexOutput = kPortIndexInput + 1; 106592fb9ab603751d3743c2668835cf278d1509926dRam Mohan M } 106692fb9ab603751d3743c2668835cf278d1509926dRam Mohan M 106792fb9ab603751d3743c2668835cf278d1509926dRam Mohan M // Configure input port 106892fb9ab603751d3743c2668835cf278d1509926dRam Mohan M uint32_t nFrameWidth = 352; 106992fb9ab603751d3743c2668835cf278d1509926dRam Mohan M uint32_t nFrameHeight = 288; 107092fb9ab603751d3743c2668835cf278d1509926dRam Mohan M uint32_t xFramerate = (30U << 16); 107192fb9ab603751d3743c2668835cf278d1509926dRam Mohan M OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatAndroidOpaque; 107292fb9ab603751d3743c2668835cf278d1509926dRam Mohan M setupRAWPort(omxNode, kPortIndexInput, nFrameWidth, nFrameHeight, 0, 107392fb9ab603751d3743c2668835cf278d1509926dRam Mohan M xFramerate, eColorFormat); 107492fb9ab603751d3743c2668835cf278d1509926dRam Mohan M 107592fb9ab603751d3743c2668835cf278d1509926dRam Mohan M sp<DummyBufferSource> buffersource = new DummyBufferSource(omxNode); 10767bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NE(buffersource, nullptr); 107792fb9ab603751d3743c2668835cf278d1509926dRam Mohan M status = omxNode->setInputSurface(buffersource); 107892fb9ab603751d3743c2668835cf278d1509926dRam Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 107992fb9ab603751d3743c2668835cf278d1509926dRam Mohan M 108092fb9ab603751d3743c2668835cf278d1509926dRam Mohan M // set port mode 108192fb9ab603751d3743c2668835cf278d1509926dRam Mohan M PortMode portMode[2]; 108292fb9ab603751d3743c2668835cf278d1509926dRam Mohan M portMode[0] = PortMode::DYNAMIC_ANW_BUFFER; 108392fb9ab603751d3743c2668835cf278d1509926dRam Mohan M portMode[1] = PortMode::PRESET_BYTE_BUFFER; 108492fb9ab603751d3743c2668835cf278d1509926dRam Mohan M status = omxNode->setPortMode(kPortIndexInput, portMode[0]); 108592fb9ab603751d3743c2668835cf278d1509926dRam Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 108692fb9ab603751d3743c2668835cf278d1509926dRam Mohan M status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); 108792fb9ab603751d3743c2668835cf278d1509926dRam Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 108892fb9ab603751d3743c2668835cf278d1509926dRam Mohan M 108992fb9ab603751d3743c2668835cf278d1509926dRam Mohan M // set state to idle 10907bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(changeStateLoadedtoIdle( 10917bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M omxNode, observer, &buffersource->iBuffer, &buffersource->oBuffer, 10927bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexInput, kPortIndexOutput, portMode)); 109392fb9ab603751d3743c2668835cf278d1509926dRam Mohan M // set state to executing 10947bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); 10957bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(testEOS(omxNode, observer, &buffersource->iBuffer, 10967bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M &buffersource->oBuffer, false, eosFlag)); 109792fb9ab603751d3743c2668835cf278d1509926dRam Mohan M // set state to idle 10987bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(changeStateExecutetoIdle( 10997bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M omxNode, observer, &buffersource->iBuffer, &buffersource->oBuffer)); 110092fb9ab603751d3743c2668835cf278d1509926dRam Mohan M // set state to executing 11017bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded( 11027bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M omxNode, observer, &buffersource->iBuffer, &buffersource->oBuffer, 11037bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexInput, kPortIndexOutput)); 110492fb9ab603751d3743c2668835cf278d1509926dRam Mohan M // test for callbacks 110592fb9ab603751d3743c2668835cf278d1509926dRam Mohan M EXPECT_EQ(buffersource->callback, 31); 110692fb9ab603751d3743c2668835cf278d1509926dRam Mohan M} 110792fb9ab603751d3743c2668835cf278d1509926dRam Mohan M 1108ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M// test raw stream encode (input is byte buffers) 1109f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan MTEST_F(VideoEncHidlTest, EncodeTest) { 1110f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M description("Test Encode"); 1111a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (disableTest) return; 1112f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M android::hardware::media::omx::V1_0::Status status; 1113f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M uint32_t kPortIndexInput = 0, kPortIndexOutput = 1; 1114f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = setRole(omxNode, gEnv->getRole().c_str()); 1115f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1116f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M OMX_PORT_PARAM_TYPE params; 1117f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms); 1118f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M if (status == ::android::hardware::media::omx::V1_0::Status::OK) { 1119f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ASSERT_EQ(params.nPorts, 2U); 1120f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M kPortIndexInput = params.nStartPortNumber; 1121f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M kPortIndexOutput = kPortIndexInput + 1; 1122f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 112323c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M char mURL[512]; 112423c658f118fe66c84a2812830d0ae7bc7afb90e9Ram Mohan M strcpy(mURL, gEnv->getRes().c_str()); 1125a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M GetURLForComponent(mURL); 1126f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 1127f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M std::ifstream eleStream; 1128ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 1129ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M timestampDevTest = true; 1130f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 1131f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // Configure input port 1132a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M uint32_t nFrameWidth = 352; 1133a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M uint32_t nFrameHeight = 288; 1134f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M uint32_t xFramerate = (30U << 16); 11351d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatUnused; 11361d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M OMX_VIDEO_PARAM_PORTFORMATTYPE portFormat; 11371d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M portFormat.nIndex = 0; 11381d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M while (1) { 11391d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M status = getPortParam(omxNode, OMX_IndexParamVideoPortFormat, 11401d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M kPortIndexInput, &portFormat); 11411d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M if (status != ::android::hardware::media::omx::V1_0::Status::OK) break; 11421d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M EXPECT_EQ(portFormat.eCompressionFormat, OMX_VIDEO_CodingUnused); 11431d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M if (OMX_COLOR_FormatYUV420SemiPlanar == portFormat.eColorFormat || 11441d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M OMX_COLOR_FormatYUV420Planar == portFormat.eColorFormat) { 11451d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M eColorFormat = portFormat.eColorFormat; 11461d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M break; 11471d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M } 11481d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M portFormat.nIndex++; 11491d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M if (portFormat.nIndex == 512) break; 11501d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M } 11511d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M ASSERT_NE(eColorFormat, OMX_COLOR_FormatUnused); 1152f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M setupRAWPort(omxNode, kPortIndexInput, nFrameWidth, nFrameHeight, 0, 1153f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M xFramerate, eColorFormat); 11541d273b3bcf4451cc36ab7ab138e41eae4cec5e21Ram Mohan M 1155f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // Configure output port 1156a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M uint32_t nBitRate = 512000; 11577bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE( 11587bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M setDefaultPortParam(omxNode, kPortIndexOutput, eCompressionFormat, 11597bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M nFrameWidth, nFrameHeight, nBitRate, xFramerate)); 1160a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M setRefreshPeriod(omxNode, kPortIndexOutput, 0); 1161ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 1162a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M unsigned int index; 1163a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M omxNode->getExtensionIndex( 1164a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M "OMX.google.android.index.prependSPSPPSToIDRFrames", 1165a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M [&status, &index](android::hardware::media::omx::V1_0::Status _s, 1166a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M unsigned int _nl) { 1167a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M status = _s; 1168a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M index = _nl; 1169a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M }); 1170a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (status == ::android::hardware::media::omx::V1_0::Status::OK) { 1171a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M android::PrependSPSPPSToIDRFramesParams param; 1172a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M param.bEnable = OMX_TRUE; 1173a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M status = setParam(omxNode, static_cast<OMX_INDEXTYPE>(index), ¶m); 1174a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M } 1175a558d9d5fd49ed7b730162c92ef829b85becca91Ram Mohan M if (status != ::android::hardware::media::omx::V1_0::Status::OK) 11760a9ac2ac7881fb1db5cec5ddf67b5419379c4da1Ram Mohan M std::cout << "[ INFO ] unable to prependSPSPPSToIDRFrames\n"; 1177ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M else 1178ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M prependSPSPPS = true; 1179ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 1180ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M // set port mode 1181ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M PortMode portMode[2]; 1182ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M portMode[0] = portMode[1] = PortMode::PRESET_BYTE_BUFFER; 1183ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M status = omxNode->setPortMode(kPortIndexInput, portMode[0]); 1184ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1185ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); 1186ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1187f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 118892fb9ab603751d3743c2668835cf278d1509926dRam Mohan M uint32_t latency = 0; 118992fb9ab603751d3743c2668835cf278d1509926dRam Mohan M setLatency(omxNode, kPortIndexInput, latency); 119092fb9ab603751d3743c2668835cf278d1509926dRam Mohan M getLatency(omxNode, kPortIndexInput, &latency); 119192fb9ab603751d3743c2668835cf278d1509926dRam Mohan M 1192f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M android::Vector<BufferInfo> iBuffer, oBuffer; 1193f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 1194f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // set state to idle 11957bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE( 11967bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, 11977bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexInput, kPortIndexOutput, portMode)); 1198f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // set state to executing 11997bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); 1200f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 1201ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M eleStream.open(mURL, std::ifstream::binary); 1202ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ASSERT_EQ(eleStream.is_open(), true); 12037bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(encodeNFrames( 12047bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M omxNode, observer, kPortIndexInput, kPortIndexOutput, &iBuffer, 12057bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M &oBuffer, 32, xFramerate, (nFrameWidth * nFrameHeight * 3) >> 1, 12067bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M eleStream, ×tampUslist)); 1207ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M eleStream.close(); 12087bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE( 12097bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M waitOnInputConsumption(omxNode, observer, &iBuffer, &oBuffer)); 12107bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE( 12117bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag)); 1212dc6270ecc1d6a3ac18b2820ef176bb4ea58fba3fRam Mohan M if (timestampDevTest) EXPECT_EQ(timestampUslist.empty(), true); 1213ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 1214f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // set state to idle 12157bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE( 12167bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); 1217f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M // set state to executing 12187bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, 12197bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M &oBuffer, kPortIndexInput, 12207bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexOutput)); 1221ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M} 1222ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 1223ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M// test raw stream encode (input is ANW buffers) 1224ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan MTEST_F(VideoEncHidlTest, EncodeTestBufferMetaModes) { 1225ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M description("Test Encode Input buffer metamodes"); 1226ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (disableTest) return; 1227ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M android::hardware::media::omx::V1_0::Status status; 1228ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M uint32_t kPortIndexInput = 0, kPortIndexOutput = 1; 1229ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M status = setRole(omxNode, gEnv->getRole().c_str()); 1230ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1231ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M OMX_PORT_PARAM_TYPE params; 1232ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms); 1233ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (status == ::android::hardware::media::omx::V1_0::Status::OK) { 1234ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ASSERT_EQ(params.nPorts, 2U); 1235ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M kPortIndexInput = params.nStartPortNumber; 1236ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M kPortIndexOutput = kPortIndexInput + 1; 1237ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } 1238ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 1239ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M // Configure input port 1240ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M uint32_t nFrameWidth = 352; 1241ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M uint32_t nFrameHeight = 288; 1242ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M uint32_t xFramerate = (30U << 16); 1243ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatAndroidOpaque; 1244ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M setupRAWPort(omxNode, kPortIndexInput, nFrameWidth, nFrameHeight, 0, 1245ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M xFramerate, eColorFormat); 1246ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 1247b7ae92bacbb83e3ca2c55efaa1ccb38422d4de8dRam Mohan M // Configure output port 1248b7ae92bacbb83e3ca2c55efaa1ccb38422d4de8dRam Mohan M uint32_t nBitRate = 512000; 12497bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE( 12507bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M setDefaultPortParam(omxNode, kPortIndexOutput, eCompressionFormat, 12517bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M nFrameWidth, nFrameHeight, nBitRate, xFramerate)); 1252ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M // CreateInputSurface 1253ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M EXPECT_TRUE(omx->createInputSurface( 1254ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M [&](android::hardware::media::omx::V1_0::Status _s, 1255ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M sp<IGraphicBufferProducer> const& _nl, 1256ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M sp<IGraphicBufferSource> const& _n2) { 1257ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M status = _s; 1258ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M producer = _nl; 1259ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M source = _n2; 1260ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M }) 1261ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M .isOk()); 1262ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ASSERT_NE(producer, nullptr); 1263ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ASSERT_NE(source, nullptr); 1264ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 1265ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M // setMaxDequeuedBufferCount 1266ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M int32_t returnval; 1267ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M int32_t value; 1268ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M producer->query(NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, 1269ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M [&returnval, &value](int32_t _s, int32_t _n1) { 1270ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M returnval = _s; 1271ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M value = _n1; 1272ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M }); 1273ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ASSERT_EQ(returnval, 0); 1274ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M OMX_PARAM_PORTDEFINITIONTYPE portDef; 1275ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M status = getPortParam(omxNode, OMX_IndexParamPortDefinition, 1276ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M kPortIndexInput, &portDef); 1277ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1278ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ASSERT_EQ(::android::OK, 1279ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M producer->setMaxDequeuedBufferCount(portDef.nBufferCountActual)); 1280ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 1281ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M // Connect :: Mock Producer Listener 1282ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M IGraphicBufferProducer::QueueBufferOutput qbo; 1283ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M sp<CodecProducerListener> listener = 1284ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M new CodecProducerListener(portDef.nBufferCountActual + value, value); 1285ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M producer->connect( 1286ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M listener, NATIVE_WINDOW_API_CPU, false, 1287ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M [&](int32_t _s, IGraphicBufferProducer::QueueBufferOutput const& _n1) { 1288ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M returnval = _s; 1289ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M qbo = _n1; 1290ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M }); 1291ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ASSERT_EQ(returnval, 0); 1292ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 1293ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M portDef.nBufferCountActual = portDef.nBufferCountActual + value; 1294ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M status = setPortParam(omxNode, OMX_IndexParamPortDefinition, 1295ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M kPortIndexInput, &portDef); 1296ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1297ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 129892fb9ab603751d3743c2668835cf278d1509926dRam Mohan M // Do setInputSurface() 129992fb9ab603751d3743c2668835cf278d1509926dRam Mohan M // enable MetaMode on input port 130092fb9ab603751d3743c2668835cf278d1509926dRam Mohan M status = source->configure( 130192fb9ab603751d3743c2668835cf278d1509926dRam Mohan M omxNode, android::hardware::graphics::common::V1_0::Dataspace::UNKNOWN); 130292fb9ab603751d3743c2668835cf278d1509926dRam Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 130392fb9ab603751d3743c2668835cf278d1509926dRam Mohan M 1304ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M // set port mode 1305ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M PortMode portMode[2]; 1306ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M portMode[0] = PortMode::DYNAMIC_ANW_BUFFER; 1307ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M portMode[1] = PortMode::PRESET_BYTE_BUFFER; 1308ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M status = omxNode->setPortMode(kPortIndexInput, portMode[0]); 1309ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1310ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); 1311ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1312ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 1313ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M char mURL[512]; 1314ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M strcpy(mURL, gEnv->getRes().c_str()); 1315ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M GetURLForComponent(mURL); 1316ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 131792fb9ab603751d3743c2668835cf278d1509926dRam Mohan M uint32_t latency = 0; 131892fb9ab603751d3743c2668835cf278d1509926dRam Mohan M setLatency(omxNode, kPortIndexInput, latency); 131992fb9ab603751d3743c2668835cf278d1509926dRam Mohan M getLatency(omxNode, kPortIndexInput, &latency); 132092fb9ab603751d3743c2668835cf278d1509926dRam Mohan M 1321ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M std::ifstream eleStream; 1322ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 1323ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M status = source->setSuspend(false, 0); 1324ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1325ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M status = source->setRepeatPreviousFrameDelayUs(100000); 1326ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1327ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M status = source->setMaxFps(24.0f); 1328ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1329ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M status = source->setTimeLapseConfig(24.0, 24.0); 1330ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1331ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M status = source->setTimeOffsetUs(-100); 1332ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1333ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M status = source->setStartTimeUs(10); 1334ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1335ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M status = source->setStopTimeUs(1000000); 1336ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1337ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ::android::hardware::media::omx::V1_0::ColorAspects aspects; 1338ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M aspects.range = 1339ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ::android::hardware::media::omx::V1_0::ColorAspects::Range::UNSPECIFIED; 1340ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M aspects.primaries = ::android::hardware::media::omx::V1_0::ColorAspects:: 1341ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M Primaries::UNSPECIFIED; 1342ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M aspects.transfer = ::android::hardware::media::omx::V1_0::ColorAspects:: 1343ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M Transfer::UNSPECIFIED; 1344ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M aspects.matrixCoeffs = ::android::hardware::media::omx::V1_0::ColorAspects:: 1345ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M MatrixCoeffs::UNSPECIFIED; 1346ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M status = source->setColorAspects(aspects); 1347ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1348ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M int64_t stopTimeOffsetUs; 1349ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M source->getStopTimeOffsetUs( 1350ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M [&](android::hardware::media::omx::V1_0::Status _s, int64_t _n1) { 1351ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M status = _s; 1352ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M stopTimeOffsetUs = _n1; 1353ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M }); 1354ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M EXPECT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1355ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 1356ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M android::Vector<BufferInfo> iBuffer, oBuffer; 1357ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M // set state to idle 13587bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE( 13597bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, 13607bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexInput, kPortIndexOutput, portMode)); 1361ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M // set state to executing 13627bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); 1363f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 1364ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M eleStream.open(mURL, std::ifstream::binary); 1365ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ASSERT_EQ(eleStream.is_open(), true); 13667bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(encodeNFrames( 13677bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M omxNode, observer, kPortIndexInput, kPortIndexOutput, &iBuffer, 13687bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M &oBuffer, 1024, xFramerate, (nFrameWidth * nFrameHeight * 3) >> 1, 13697bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M eleStream, nullptr, false, true, producer, listener)); 1370f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M eleStream.close(); 13717bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(waitOnInputConsumption(omxNode, observer, &iBuffer, 13727bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M &oBuffer, true, listener)); 13737bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE( 13747bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag)); 1375ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 1376ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M // set state to idle 13777bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE( 13787bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); 1379ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M EXPECT_EQ(portDef.nBufferCountActual, listener->freeBuffers); 1380ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M // set state to executing 13817bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, 13827bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M &oBuffer, kPortIndexInput, 13837bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexOutput)); 1384ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 1385ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M returnval = producer->disconnect( 1386ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M NATIVE_WINDOW_API_CPU, IGraphicBufferProducer::DisconnectMode::API); 1387ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ASSERT_EQ(returnval, 0); 1388ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M} 1389ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 1390ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M// Test end of stream 1391ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan MTEST_F(VideoEncHidlTest, EncodeTestEOS) { 1392ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M description("Test EOS"); 1393ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (disableTest) return; 1394ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M android::hardware::media::omx::V1_0::Status status; 1395ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M uint32_t kPortIndexInput = 0, kPortIndexOutput = 1; 1396ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M status = setRole(omxNode, gEnv->getRole().c_str()); 1397ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1398ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M OMX_PORT_PARAM_TYPE params; 1399ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M status = getParam(omxNode, OMX_IndexParamVideoInit, ¶ms); 1400ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M if (status == ::android::hardware::media::omx::V1_0::Status::OK) { 1401ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ASSERT_EQ(params.nPorts, 2U); 1402ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M kPortIndexInput = params.nStartPortNumber; 1403ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M kPortIndexOutput = kPortIndexInput + 1; 1404ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M } 1405ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 1406951c9212fb644ffc757809bec4805033f872d3e6Ram Mohan M // Configure input port 1407951c9212fb644ffc757809bec4805033f872d3e6Ram Mohan M uint32_t nFrameWidth = 352; 1408951c9212fb644ffc757809bec4805033f872d3e6Ram Mohan M uint32_t nFrameHeight = 288; 1409951c9212fb644ffc757809bec4805033f872d3e6Ram Mohan M uint32_t xFramerate = (30U << 16); 1410951c9212fb644ffc757809bec4805033f872d3e6Ram Mohan M OMX_COLOR_FORMATTYPE eColorFormat = OMX_COLOR_FormatAndroidOpaque; 1411951c9212fb644ffc757809bec4805033f872d3e6Ram Mohan M setupRAWPort(omxNode, kPortIndexInput, nFrameWidth, nFrameHeight, 0, 1412951c9212fb644ffc757809bec4805033f872d3e6Ram Mohan M xFramerate, eColorFormat); 1413951c9212fb644ffc757809bec4805033f872d3e6Ram Mohan M 1414ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M // CreateInputSurface 1415ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M EXPECT_TRUE(omx->createInputSurface( 1416ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M [&](android::hardware::media::omx::V1_0::Status _s, 1417ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M sp<IGraphicBufferProducer> const& _nl, 1418ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M sp<IGraphicBufferSource> const& _n2) { 1419ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M status = _s; 1420ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M producer = _nl; 1421ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M source = _n2; 1422ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M }) 1423ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M .isOk()); 1424ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ASSERT_NE(producer, nullptr); 1425ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ASSERT_NE(source, nullptr); 1426ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 1427ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M // setMaxDequeuedBufferCount 1428ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M int32_t returnval; 1429ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M int32_t value; 1430ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M producer->query(NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, 1431ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M [&returnval, &value](int32_t _s, int32_t _n1) { 1432ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M returnval = _s; 1433ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M value = _n1; 1434ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M }); 1435ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ASSERT_EQ(returnval, 0); 1436ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M OMX_PARAM_PORTDEFINITIONTYPE portDef; 1437ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M status = getPortParam(omxNode, OMX_IndexParamPortDefinition, 1438ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M kPortIndexInput, &portDef); 1439ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1440ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ASSERT_EQ(::android::OK, 1441ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M producer->setMaxDequeuedBufferCount(portDef.nBufferCountActual)); 1442ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 1443ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M // Connect :: Mock Producer Listener 1444ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M IGraphicBufferProducer::QueueBufferOutput qbo; 1445ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M sp<CodecProducerListener> listener = 1446ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M new CodecProducerListener(portDef.nBufferCountActual + value, value); 1447ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M producer->connect( 1448ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M listener, NATIVE_WINDOW_API_CPU, false, 1449ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M [&](int32_t _s, IGraphicBufferProducer::QueueBufferOutput const& _n1) { 1450ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M returnval = _s; 1451ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M qbo = _n1; 1452ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M }); 1453ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ASSERT_EQ(returnval, 0); 1454ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 1455ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M portDef.nBufferCountActual = portDef.nBufferCountActual + value; 1456ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M status = setPortParam(omxNode, OMX_IndexParamPortDefinition, 1457ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M kPortIndexInput, &portDef); 1458ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1459ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 146092fb9ab603751d3743c2668835cf278d1509926dRam Mohan M // Do setInputSurface() 146192fb9ab603751d3743c2668835cf278d1509926dRam Mohan M // enable MetaMode on input port 146292fb9ab603751d3743c2668835cf278d1509926dRam Mohan M status = source->configure( 146392fb9ab603751d3743c2668835cf278d1509926dRam Mohan M omxNode, android::hardware::graphics::common::V1_0::Dataspace::UNKNOWN); 146492fb9ab603751d3743c2668835cf278d1509926dRam Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 146592fb9ab603751d3743c2668835cf278d1509926dRam Mohan M 1466ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M // set port mode 1467ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M PortMode portMode[2]; 1468ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M portMode[0] = PortMode::DYNAMIC_ANW_BUFFER; 1469ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M portMode[1] = PortMode::PRESET_BYTE_BUFFER; 1470ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M status = omxNode->setPortMode(kPortIndexInput, portMode[0]); 1471ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1472ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M status = omxNode->setPortMode(kPortIndexOutput, portMode[1]); 1473ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 1474ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 1475ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M android::Vector<BufferInfo> iBuffer, oBuffer; 1476ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M // set state to idle 14777bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE( 14787bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M changeStateLoadedtoIdle(omxNode, observer, &iBuffer, &oBuffer, 14797bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexInput, kPortIndexOutput, portMode)); 1480ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M // set state to executing 14817bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(changeStateIdletoExecute(omxNode, observer)); 1482ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 1483ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M // send EOS 1484ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M status = source->signalEndOfInputStream(); 1485ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ASSERT_EQ(status, ::android::hardware::media::omx::V1_0::Status::OK); 14867bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(waitOnInputConsumption(omxNode, observer, &iBuffer, 14877bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M &oBuffer, true, listener)); 14887bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE( 14897bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M testEOS(omxNode, observer, &iBuffer, &oBuffer, false, eosFlag)); 1490ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 1491ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M // set state to idle 14927bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE( 14937bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M changeStateExecutetoIdle(omxNode, observer, &iBuffer, &oBuffer)); 1494ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M EXPECT_EQ(portDef.nBufferCountActual, listener->freeBuffers); 1495ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M // set state to executing 14967bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M ASSERT_NO_FATAL_FAILURE(changeStateIdletoLoaded(omxNode, observer, &iBuffer, 14977bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M &oBuffer, kPortIndexInput, 14987bb56703223f5b9a75c9b25fbdb081f0236c494cRam Mohan M kPortIndexOutput)); 1499ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M 1500ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M returnval = producer->disconnect( 1501ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M NATIVE_WINDOW_API_CPU, IGraphicBufferProducer::DisconnectMode::API); 1502ccc194cffd8ee4eff1db0b2756492df4a758bca4Ram Mohan M ASSERT_EQ(returnval, 0); 1503f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M} 1504f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M 1505f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan Mint main(int argc, char** argv) { 1506f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M gEnv = new ComponentTestEnvironment(); 1507f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ::testing::AddGlobalTestEnvironment(gEnv); 1508f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ::testing::InitGoogleTest(&argc, argv); 1509303b2917d4928017fdd74ed2ffc4c805f696958dZhuoyao Zhang gEnv->init(&argc, argv); 1510f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M int status = gEnv->initFromOptions(argc, argv); 1511f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M if (status == 0) { 1512f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M status = RUN_ALL_TESTS(); 1513f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M ALOGI("Test result = %d", status); 1514f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M } 1515f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M return status; 1516f9c4003fcdf63d86a20de2c35ee32eab72d75b16Ram Mohan M} 1517