1/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef OMX_HARNESS_H_
18
19#define OMX_HARNESS_H_
20
21#include <media/IOMX.h>
22#include <utils/List.h>
23#include <utils/Vector.h>
24#include <utils/threads.h>
25
26#include <OMX_Component.h>
27
28namespace android {
29
30class MemoryDealer;
31
32struct Harness : public BnOMXObserver {
33    enum BufferFlags {
34        kBufferBusy = 1
35    };
36    struct Buffer {
37        IOMX::buffer_id mID;
38        sp<IMemory> mMemory;
39        uint32_t mFlags;
40    };
41
42    Harness();
43
44    status_t initCheck() const;
45
46    status_t dequeueMessageForNode(
47            IOMX::node_id node, omx_message *msg, int64_t timeoutUs = -1);
48
49    status_t dequeueMessageForNodeIgnoringBuffers(
50            IOMX::node_id node,
51            Vector<Buffer> *inputBuffers,
52            Vector<Buffer> *outputBuffers,
53            omx_message *msg, int64_t timeoutUs = -1);
54
55    status_t getPortDefinition(
56            IOMX::node_id node, OMX_U32 portIndex,
57            OMX_PARAM_PORTDEFINITIONTYPE *def);
58
59    status_t allocatePortBuffers(
60            const sp<MemoryDealer> &dealer,
61            IOMX::node_id node, OMX_U32 portIndex,
62            Vector<Buffer> *buffers);
63
64    status_t setRole(IOMX::node_id node, const char *role);
65
66    status_t testStateTransitions(
67            const char *componentName, const char *componentRole);
68
69    status_t testSeek(
70            const char *componentName, const char *componentRole);
71
72    status_t test(
73            const char *componentName, const char *componentRole);
74
75    status_t testAll();
76
77    virtual void onMessage(const omx_message &msg);
78
79protected:
80    virtual ~Harness();
81
82private:
83    friend struct NodeReaper;
84
85    Mutex mLock;
86
87    status_t mInitCheck;
88    sp<IOMX> mOMX;
89    List<omx_message> mMessageQueue;
90    Condition mMessageAddedCondition;
91
92    status_t initOMX();
93
94    bool handleBufferMessage(
95            const omx_message &msg,
96            Vector<Buffer> *inputBuffers,
97            Vector<Buffer> *outputBuffers);
98
99    Harness(const Harness &);
100    Harness &operator=(const Harness &);
101};
102
103}  // namespace android
104
105#endif  // OMX_HARNESS_H_
106