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, &param);
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, &param);
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                           &param);
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, &param);
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                          &param);
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, &param);
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, &param);
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, &params);
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, &params);
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, &params);
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), &param);
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, &timestampUslist));
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, &params);
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, &params);
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