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 ANDROID_OMX_H_
18 #define ANDROID_OMX_H_
19 
20 #include <media/IOMX.h>
21 #include <utils/threads.h>
22 #include <utils/KeyedVector.h>
23 
24 namespace android {
25 
26 struct OMXMaster;
27 class OMXNodeInstance;
28 
29 class OMX : public BnOMX,
30             public IBinder::DeathRecipient {
31 public:
32     OMX();
33 
34     virtual bool livesLocally(node_id node, pid_t pid);
35 
36     virtual status_t listNodes(List<ComponentInfo> *list);
37 
38     virtual status_t allocateNode(
39             const char *name, const sp<IOMXObserver> &observer, node_id *node);
40 
41     virtual status_t freeNode(node_id node);
42 
43     virtual status_t sendCommand(
44             node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param);
45 
46     virtual status_t getParameter(
47             node_id node, OMX_INDEXTYPE index,
48             void *params, size_t size);
49 
50     virtual status_t setParameter(
51             node_id node, OMX_INDEXTYPE index,
52             const void *params, size_t size);
53 
54     virtual status_t getConfig(
55             node_id node, OMX_INDEXTYPE index,
56             void *params, size_t size);
57 
58     virtual status_t setConfig(
59             node_id node, OMX_INDEXTYPE index,
60             const void *params, size_t size);
61 
62     virtual status_t getState(
63             node_id node, OMX_STATETYPE* state);
64 
65     virtual status_t enableGraphicBuffers(
66             node_id node, OMX_U32 port_index, OMX_BOOL enable);
67 
68     virtual status_t getGraphicBufferUsage(
69             node_id node, OMX_U32 port_index, OMX_U32* usage);
70 
71     virtual status_t storeMetaDataInBuffers(
72             node_id node, OMX_U32 port_index, OMX_BOOL enable);
73 
74     virtual status_t prepareForAdaptivePlayback(
75             node_id node, OMX_U32 portIndex, OMX_BOOL enable,
76             OMX_U32 max_frame_width, OMX_U32 max_frame_height);
77 
78     virtual status_t configureVideoTunnelMode(
79             node_id node, OMX_U32 portIndex, OMX_BOOL tunneled,
80             OMX_U32 audioHwSync, native_handle_t **sidebandHandle);
81 
82     virtual status_t useBuffer(
83             node_id node, OMX_U32 port_index, const sp<IMemory> &params,
84             buffer_id *buffer);
85 
86     virtual status_t useGraphicBuffer(
87             node_id node, OMX_U32 port_index,
88             const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer);
89 
90     virtual status_t updateGraphicBufferInMeta(
91             node_id node, OMX_U32 port_index,
92             const sp<GraphicBuffer> &graphicBuffer, buffer_id buffer);
93 
94     virtual status_t createInputSurface(
95             node_id node, OMX_U32 port_index,
96             sp<IGraphicBufferProducer> *bufferProducer);
97 
98     virtual status_t signalEndOfInputStream(node_id node);
99 
100     virtual status_t allocateBuffer(
101             node_id node, OMX_U32 port_index, size_t size,
102             buffer_id *buffer, void **buffer_data);
103 
104     virtual status_t allocateBufferWithBackup(
105             node_id node, OMX_U32 port_index, const sp<IMemory> &params,
106             buffer_id *buffer);
107 
108     virtual status_t freeBuffer(
109             node_id node, OMX_U32 port_index, buffer_id buffer);
110 
111     virtual status_t fillBuffer(node_id node, buffer_id buffer);
112 
113     virtual status_t emptyBuffer(
114             node_id node,
115             buffer_id buffer,
116             OMX_U32 range_offset, OMX_U32 range_length,
117             OMX_U32 flags, OMX_TICKS timestamp);
118 
119     virtual status_t getExtensionIndex(
120             node_id node,
121             const char *parameter_name,
122             OMX_INDEXTYPE *index);
123 
124     virtual status_t setInternalOption(
125             node_id node,
126             OMX_U32 port_index,
127             InternalOptionType type,
128             const void *data,
129             size_t size);
130 
131     virtual void binderDied(const wp<IBinder> &the_late_who);
132 
133     OMX_ERRORTYPE OnEvent(
134             node_id node,
135             OMX_IN OMX_EVENTTYPE eEvent,
136             OMX_IN OMX_U32 nData1,
137             OMX_IN OMX_U32 nData2,
138             OMX_IN OMX_PTR pEventData);
139 
140     OMX_ERRORTYPE OnEmptyBufferDone(
141             node_id node, buffer_id buffer, OMX_IN OMX_BUFFERHEADERTYPE *pBuffer);
142 
143     OMX_ERRORTYPE OnFillBufferDone(
144             node_id node, buffer_id buffer, OMX_IN OMX_BUFFERHEADERTYPE *pBuffer);
145 
146     void invalidateNodeID(node_id node);
147 
148 protected:
149     virtual ~OMX();
150 
151 private:
152     struct CallbackDispatcherThread;
153     struct CallbackDispatcher;
154 
155     Mutex mLock;
156     OMXMaster *mMaster;
157     int32_t mNodeCounter;
158 
159     KeyedVector<wp<IBinder>, OMXNodeInstance *> mLiveNodes;
160     KeyedVector<node_id, OMXNodeInstance *> mNodeIDToInstance;
161     KeyedVector<node_id, sp<CallbackDispatcher> > mDispatchers;
162 
163     node_id makeNodeID(OMXNodeInstance *instance);
164     OMXNodeInstance *findInstance(node_id node);
165     sp<CallbackDispatcher> findDispatcher(node_id node);
166 
167     void invalidateNodeID_l(node_id node);
168 
169     OMX(const OMX &);
170     OMX &operator=(const OMX &);
171 };
172 
173 }  // namespace android
174 
175 #endif  // ANDROID_OMX_H_
176