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