• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_IOMX_H_
18 
19 #define ANDROID_IOMX_H_
20 
21 #include <binder/IInterface.h>
22 #include <gui/IGraphicBufferProducer.h>
23 #include <ui/GraphicBuffer.h>
24 #include <utils/List.h>
25 #include <utils/String8.h>
26 
27 #include <OMX_Core.h>
28 #include <OMX_Video.h>
29 
30 namespace android {
31 
32 class IMemory;
33 class IOMXObserver;
34 class IOMXRenderer;
35 class Surface;
36 
37 class IOMX : public IInterface {
38 public:
39     DECLARE_META_INTERFACE(OMX);
40 
41     typedef void *buffer_id;
42     typedef void *node_id;
43 
44     // Given a node_id and the calling process' pid, returns true iff
45     // the implementation of the OMX interface lives in the same
46     // process.
47     virtual bool livesLocally(node_id node, pid_t pid) = 0;
48 
49     struct ComponentInfo {
50         String8 mName;
51         List<String8> mRoles;
52     };
53     virtual status_t listNodes(List<ComponentInfo> *list) = 0;
54 
55     virtual status_t allocateNode(
56             const char *name, const sp<IOMXObserver> &observer,
57             node_id *node) = 0;
58 
59     virtual status_t freeNode(node_id node) = 0;
60 
61     virtual status_t sendCommand(
62             node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) = 0;
63 
64     virtual status_t getParameter(
65             node_id node, OMX_INDEXTYPE index,
66             void *params, size_t size) = 0;
67 
68     virtual status_t setParameter(
69             node_id node, OMX_INDEXTYPE index,
70             const void *params, size_t size) = 0;
71 
72     virtual status_t getConfig(
73             node_id node, OMX_INDEXTYPE index,
74             void *params, size_t size) = 0;
75 
76     virtual status_t setConfig(
77             node_id node, OMX_INDEXTYPE index,
78             const void *params, size_t size) = 0;
79 
80     virtual status_t getState(
81             node_id node, OMX_STATETYPE* state) = 0;
82 
83     virtual status_t storeMetaDataInBuffers(
84             node_id node, OMX_U32 port_index, OMX_BOOL enable) = 0;
85 
86     virtual status_t prepareForAdaptivePlayback(
87             node_id node, OMX_U32 portIndex, OMX_BOOL enable,
88             OMX_U32 maxFrameWidth, OMX_U32 maxFrameHeight) = 0;
89 
90     virtual status_t enableGraphicBuffers(
91             node_id node, OMX_U32 port_index, OMX_BOOL enable) = 0;
92 
93     virtual status_t getGraphicBufferUsage(
94             node_id node, OMX_U32 port_index, OMX_U32* usage) = 0;
95 
96     virtual status_t useBuffer(
97             node_id node, OMX_U32 port_index, const sp<IMemory> &params,
98             buffer_id *buffer) = 0;
99 
100     virtual status_t useGraphicBuffer(
101             node_id node, OMX_U32 port_index,
102             const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) = 0;
103 
104     virtual status_t updateGraphicBufferInMeta(
105             node_id node, OMX_U32 port_index,
106             const sp<GraphicBuffer> &graphicBuffer, buffer_id buffer) = 0;
107 
108     virtual status_t createInputSurface(
109             node_id node, OMX_U32 port_index,
110             sp<IGraphicBufferProducer> *bufferProducer) = 0;
111 
112     virtual status_t signalEndOfInputStream(node_id node) = 0;
113 
114     // This API clearly only makes sense if the caller lives in the
115     // same process as the callee, i.e. is the media_server, as the
116     // returned "buffer_data" pointer is just that, a pointer into local
117     // address space.
118     virtual status_t allocateBuffer(
119             node_id node, OMX_U32 port_index, size_t size,
120             buffer_id *buffer, void **buffer_data) = 0;
121 
122     virtual status_t allocateBufferWithBackup(
123             node_id node, OMX_U32 port_index, const sp<IMemory> &params,
124             buffer_id *buffer) = 0;
125 
126     virtual status_t freeBuffer(
127             node_id node, OMX_U32 port_index, buffer_id buffer) = 0;
128 
129     virtual status_t fillBuffer(node_id node, buffer_id buffer) = 0;
130 
131     virtual status_t emptyBuffer(
132             node_id node,
133             buffer_id buffer,
134             OMX_U32 range_offset, OMX_U32 range_length,
135             OMX_U32 flags, OMX_TICKS timestamp) = 0;
136 
137     virtual status_t getExtensionIndex(
138             node_id node,
139             const char *parameter_name,
140             OMX_INDEXTYPE *index) = 0;
141 
142     enum InternalOptionType {
143         INTERNAL_OPTION_SUSPEND,  // data is a bool
144         INTERNAL_OPTION_REPEAT_PREVIOUS_FRAME_DELAY,  // data is an int64_t
145         INTERNAL_OPTION_MAX_TIMESTAMP_GAP, // data is int64_t
146     };
147     virtual status_t setInternalOption(
148             node_id node,
149             OMX_U32 port_index,
150             InternalOptionType type,
151             const void *data,
152             size_t size) = 0;
153 };
154 
155 struct omx_message {
156     enum {
157         EVENT,
158         EMPTY_BUFFER_DONE,
159         FILL_BUFFER_DONE,
160 
161     } type;
162 
163     IOMX::node_id node;
164 
165     union {
166         // if type == EVENT
167         struct {
168             OMX_EVENTTYPE event;
169             OMX_U32 data1;
170             OMX_U32 data2;
171         } event_data;
172 
173         // if type == EMPTY_BUFFER_DONE
174         struct {
175             IOMX::buffer_id buffer;
176         } buffer_data;
177 
178         // if type == FILL_BUFFER_DONE
179         struct {
180             IOMX::buffer_id buffer;
181             OMX_U32 range_offset;
182             OMX_U32 range_length;
183             OMX_U32 flags;
184             OMX_TICKS timestamp;
185             OMX_PTR platform_private;
186             OMX_PTR data_ptr;
187         } extended_buffer_data;
188 
189     } u;
190 };
191 
192 class IOMXObserver : public IInterface {
193 public:
194     DECLARE_META_INTERFACE(OMXObserver);
195 
196     virtual void onMessage(const omx_message &msg) = 0;
197 };
198 
199 ////////////////////////////////////////////////////////////////////////////////
200 
201 class BnOMX : public BnInterface<IOMX> {
202 public:
203     virtual status_t onTransact(
204             uint32_t code, const Parcel &data, Parcel *reply,
205             uint32_t flags = 0);
206 };
207 
208 class BnOMXObserver : public BnInterface<IOMXObserver> {
209 public:
210     virtual status_t onTransact(
211             uint32_t code, const Parcel &data, Parcel *reply,
212             uint32_t flags = 0);
213 };
214 
215 struct CodecProfileLevel {
216     OMX_U32 mProfile;
217     OMX_U32 mLevel;
218 };
219 
220 }  // namespace android
221 
222 #endif  // ANDROID_IOMX_H_
223