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