1 /*
2 * Copyright 2018 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 GOLDFISH_OMX_COMPONENT_H_
18
19 #define GOLDFISH_OMX_COMPONENT_H_
20
21 #include <media/stagefright/foundation/ABase.h>
22 #include <media/stagefright/foundation/AString.h>
23 #include <utils/RefBase.h>
24
25 #include <OMX_Component.h>
26
27 namespace android {
28
29 struct GoldfishOMXComponent : public RefBase {
30 GoldfishOMXComponent(
31 const char *name,
32 const OMX_CALLBACKTYPE *callbacks,
33 OMX_PTR appData,
34 OMX_COMPONENTTYPE **component);
35
36 virtual OMX_ERRORTYPE initCheck();
37
38 void setLibHandle(void *libHandle);
39 void *libHandle() const;
40
41 virtual void prepareForDestruction();
42
43 protected:
44 virtual ~GoldfishOMXComponent();
45
46 const char *name() const;
47
48 void notify(
49 OMX_EVENTTYPE event,
50 OMX_U32 data1, OMX_U32 data2, OMX_PTR data);
51
52 void notifyEmptyBufferDone(OMX_BUFFERHEADERTYPE *header);
53 void notifyFillBufferDone(OMX_BUFFERHEADERTYPE *header);
54
55 virtual OMX_ERRORTYPE sendCommand(
56 OMX_COMMANDTYPE cmd, OMX_U32 param, OMX_PTR data);
57
58 virtual OMX_ERRORTYPE getParameter(
59 OMX_INDEXTYPE index, OMX_PTR params);
60
61 virtual OMX_ERRORTYPE setParameter(
62 OMX_INDEXTYPE index, const OMX_PTR params);
63
64 virtual OMX_ERRORTYPE getConfig(
65 OMX_INDEXTYPE index, OMX_PTR params);
66
67 virtual OMX_ERRORTYPE setConfig(
68 OMX_INDEXTYPE index, const OMX_PTR params);
69
70 virtual OMX_ERRORTYPE getExtensionIndex(
71 const char *name, OMX_INDEXTYPE *index);
72
73 virtual OMX_ERRORTYPE useBuffer(
74 OMX_BUFFERHEADERTYPE **buffer,
75 OMX_U32 portIndex,
76 OMX_PTR appPrivate,
77 OMX_U32 size,
78 OMX_U8 *ptr);
79
80 virtual OMX_ERRORTYPE allocateBuffer(
81 OMX_BUFFERHEADERTYPE **buffer,
82 OMX_U32 portIndex,
83 OMX_PTR appPrivate,
84 OMX_U32 size);
85
86 virtual OMX_ERRORTYPE freeBuffer(
87 OMX_U32 portIndex,
88 OMX_BUFFERHEADERTYPE *buffer);
89
90 virtual OMX_ERRORTYPE emptyThisBuffer(
91 OMX_BUFFERHEADERTYPE *buffer);
92
93 virtual OMX_ERRORTYPE fillThisBuffer(
94 OMX_BUFFERHEADERTYPE *buffer);
95
96 virtual OMX_ERRORTYPE getState(OMX_STATETYPE *state);
97
98 private:
99 AString mName;
100 const OMX_CALLBACKTYPE *mCallbacks;
101 OMX_COMPONENTTYPE *mComponent;
102
103 void *mLibHandle;
104
105 static OMX_ERRORTYPE SendCommandWrapper(
106 OMX_HANDLETYPE component,
107 OMX_COMMANDTYPE cmd,
108 OMX_U32 param,
109 OMX_PTR data);
110
111 static OMX_ERRORTYPE GetParameterWrapper(
112 OMX_HANDLETYPE component,
113 OMX_INDEXTYPE index,
114 OMX_PTR params);
115
116 static OMX_ERRORTYPE SetParameterWrapper(
117 OMX_HANDLETYPE component,
118 OMX_INDEXTYPE index,
119 OMX_PTR params);
120
121 static OMX_ERRORTYPE GetConfigWrapper(
122 OMX_HANDLETYPE component,
123 OMX_INDEXTYPE index,
124 OMX_PTR params);
125
126 static OMX_ERRORTYPE SetConfigWrapper(
127 OMX_HANDLETYPE component,
128 OMX_INDEXTYPE index,
129 OMX_PTR params);
130
131 static OMX_ERRORTYPE GetExtensionIndexWrapper(
132 OMX_HANDLETYPE component,
133 OMX_STRING name,
134 OMX_INDEXTYPE *index);
135
136 static OMX_ERRORTYPE UseBufferWrapper(
137 OMX_HANDLETYPE component,
138 OMX_BUFFERHEADERTYPE **buffer,
139 OMX_U32 portIndex,
140 OMX_PTR appPrivate,
141 OMX_U32 size,
142 OMX_U8 *ptr);
143
144 static OMX_ERRORTYPE AllocateBufferWrapper(
145 OMX_HANDLETYPE component,
146 OMX_BUFFERHEADERTYPE **buffer,
147 OMX_U32 portIndex,
148 OMX_PTR appPrivate,
149 OMX_U32 size);
150
151 static OMX_ERRORTYPE FreeBufferWrapper(
152 OMX_HANDLETYPE component,
153 OMX_U32 portIndex,
154 OMX_BUFFERHEADERTYPE *buffer);
155
156 static OMX_ERRORTYPE EmptyThisBufferWrapper(
157 OMX_HANDLETYPE component,
158 OMX_BUFFERHEADERTYPE *buffer);
159
160 static OMX_ERRORTYPE FillThisBufferWrapper(
161 OMX_HANDLETYPE component,
162 OMX_BUFFERHEADERTYPE *buffer);
163
164 static OMX_ERRORTYPE GetStateWrapper(
165 OMX_HANDLETYPE component,
166 OMX_STATETYPE *state);
167
168 DISALLOW_EVIL_CONSTRUCTORS(GoldfishOMXComponent);
169 };
170
171 template<typename T>
isValidOMXParam(T * a)172 bool isValidOMXParam(T *a) {
173 static_assert(offsetof(typeof(*a), nSize) == 0, "nSize not at offset 0");
174 static_assert(std::is_same< decltype(a->nSize), OMX_U32>::value, "nSize has wrong type");
175 static_assert(offsetof(typeof(*a), nVersion) == 4, "nVersion not at offset 4");
176 static_assert(std::is_same< decltype(a->nVersion), OMX_VERSIONTYPE>::value,
177 "nVersion has wrong type");
178
179 if (a->nSize < sizeof(*a)) {
180 ALOGE("b/27207275: need %zu, got %u", sizeof(*a), a->nSize);
181 //android_errorWriteLog(0x534e4554, "27207275");
182 return false;
183 }
184 return true;
185 }
186
187 } // namespace android
188
189 #endif // GOLDFISH_OMX_COMPONENT_H_
190