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
26134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber#include <OMX_Component.h>
27134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
28134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Hubernamespace android {
29134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
30134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huberclass MemoryDealer;
31134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
32134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huberstruct Harness : public BnOMXObserver {
33134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    enum BufferFlags {
34134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        kBufferBusy = 1
35134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    };
36134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    struct Buffer {
37134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        IOMX::buffer_id mID;
38134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        sp<IMemory> mMemory;
39134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        uint32_t mFlags;
40134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    };
41134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
42134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    Harness();
43134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
44134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    status_t initCheck() const;
45134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
46134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    status_t dequeueMessageForNode(
47134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            IOMX::node_id node, omx_message *msg, int64_t timeoutUs = -1);
48134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
49134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    status_t dequeueMessageForNodeIgnoringBuffers(
50134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            IOMX::node_id node,
51134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            Vector<Buffer> *inputBuffers,
52134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            Vector<Buffer> *outputBuffers,
53134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            omx_message *msg, int64_t timeoutUs = -1);
54134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
55134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    status_t getPortDefinition(
56134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            IOMX::node_id node, OMX_U32 portIndex,
57134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            OMX_PARAM_PORTDEFINITIONTYPE *def);
58134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
59134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    status_t allocatePortBuffers(
60134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            const sp<MemoryDealer> &dealer,
61134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            IOMX::node_id node, OMX_U32 portIndex,
62134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            Vector<Buffer> *buffers);
63134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
64134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    status_t setRole(IOMX::node_id node, const char *role);
65134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
66134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    status_t testStateTransitions(
67134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            const char *componentName, const char *componentRole);
68134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
69134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    status_t testSeek(
70134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            const char *componentName, const char *componentRole);
71134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
72134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    status_t test(
73134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            const char *componentName, const char *componentRole);
74134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
75134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    status_t testAll();
76134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
77134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    virtual void onMessage(const omx_message &msg);
78134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
79134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huberprotected:
80134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    virtual ~Harness();
81134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
82134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huberprivate:
83134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    friend struct NodeReaper;
84134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
85134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    Mutex mLock;
86134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
87134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    status_t mInitCheck;
88134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    sp<IOMX> mOMX;
89134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    List<omx_message> mMessageQueue;
90134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    Condition mMessageAddedCondition;
91134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
92134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    status_t initOMX();
93134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
94134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    bool handleBufferMessage(
95134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            const omx_message &msg,
96134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            Vector<Buffer> *inputBuffers,
97134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber            Vector<Buffer> *outputBuffers);
98134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
99134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    Harness(const Harness &);
100134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    Harness &operator=(const Harness &);
101134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber};
102134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
103134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber}  // namespace android
104134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber
105134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber#endif  // OMX_HARNESS_H_
106