1134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber/*
2134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber * Copyright (C) 2009 The Android Open Source Project
3134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber *
4134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber * you may not use this file except in compliance with the License.
6134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber * You may obtain a copy of the License at
7134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber *
8134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber *
10134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber * Unless required by applicable law or agreed to in writing, software
11134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber * See the License for the specific language governing permissions and
14134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber * limitations under the License.
15134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber */
16134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
17134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber#ifndef OMX_HARNESS_H_
18134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
19134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber#define OMX_HARNESS_H_
20134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
21134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber#include <media/IOMX.h>
22134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber#include <utils/List.h>
23134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber#include <utils/Vector.h>
24134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber#include <utils/threads.h>
25134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
269c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa#include <binder/MemoryDealer.h>
2713a926879249276771b0097538459c7550e2f5ceSteven Moreland#include <android/hidl/allocator/1.0/IAllocator.h>
289c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa#include <android/hidl/memory/1.0/IMemory.h>
29134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber#include <OMX_Component.h>
30134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
31134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Hubernamespace android {
32134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
33134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huberclass MemoryDealer;
34134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
35d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhangstruct Harness : public RefBase {
369c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    typedef hidl::memory::V1_0::IMemory TMemory;
379c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    typedef hardware::hidl_memory hidl_memory;
38134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    enum BufferFlags {
39134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        kBufferBusy = 1
40134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    };
41134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    struct Buffer {
42134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        IOMX::buffer_id mID;
43134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        sp<IMemory> mMemory;
449c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa        hidl_memory mHidlMemory;
45134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        uint32_t mFlags;
46134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    };
47134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
48134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    Harness();
49134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
50134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    status_t initCheck() const;
51134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
52d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang    status_t dequeueMessageForNode(omx_message *msg, int64_t timeoutUs = -1);
53134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
54134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    status_t dequeueMessageForNodeIgnoringBuffers(
55134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            Vector<Buffer> *inputBuffers,
56134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            Vector<Buffer> *outputBuffers,
57134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            omx_message *msg, int64_t timeoutUs = -1);
58134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
59134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    status_t getPortDefinition(
60d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang            OMX_U32 portIndex, OMX_PARAM_PORTDEFINITIONTYPE *def);
61134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
62134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    status_t allocatePortBuffers(
63d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang            OMX_U32 portIndex, Vector<Buffer> *buffers);
64134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
65d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang    status_t setRole(const char *role);
66134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
67134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    status_t testStateTransitions(
68134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            const char *componentName, const char *componentRole);
69134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
70134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    status_t testSeek(
71134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            const char *componentName, const char *componentRole);
72134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
73134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    status_t test(
74134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            const char *componentName, const char *componentRole);
75134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
76134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    status_t testAll();
77134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
78134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huberprotected:
79134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    virtual ~Harness();
80134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
81134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huberprivate:
820d3a5edf232916e81adbc46fc0f4a1753166b066Pawin Vongmasa    typedef hidl::allocator::V1_0::IAllocator IAllocator;
839c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa
84134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    friend struct NodeReaper;
85d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang    struct CodecObserver;
86134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
87134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    Mutex mLock;
88134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
89134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    status_t mInitCheck;
90134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    sp<IOMX> mOMX;
91d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang    sp<IOMXNode> mOMXNode;
92134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    List<omx_message> mMessageQueue;
93134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    Condition mMessageAddedCondition;
94d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang    int32_t mLastMsgGeneration;
95d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang    int32_t mCurGeneration;
969c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    bool mUseTreble;
979c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    sp<MemoryDealer> mDealer;
989c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    sp<IAllocator> mAllocator;
99134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
100134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    status_t initOMX();
101134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
102134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    bool handleBufferMessage(
103134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            const omx_message &msg,
104134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            Vector<Buffer> *inputBuffers,
105134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            Vector<Buffer> *outputBuffers);
106134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
107d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang    void handleMessages(int32_t gen, const std::list<omx_message> &messages);
108d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang
109134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    Harness(const Harness &);
110134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    Harness &operator=(const Harness &);
111134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber};
112134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
113134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber}  // namespace android
114134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
115134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber#endif  // OMX_HARNESS_H_
116