1/*
2 * Copyright (C) 2016 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
17package [email protected];
18
19import IOmxBufferSource;
20
21import [email protected]::types;
22
23/**
24 * Ref: frameworks/av/include/media/IOMX.h: IOMXNode
25 * Ref: https://www.khronos.org/registry/omxil/specs/OpenMAX_IL_1_1_2_Specification.pdf
26 */
27
28/**
29 * IOmxNode is an interface for communicating with an OMX component (called
30 * "node" here) that has been previously obtained by calling
31 * IOmx::allocateNode().
32 */
33interface IOmxNode {
34
35    /**
36     * Free the node.
37     *
38     * @return status Status of the call.
39     */
40    freeNode(
41        ) generates (
42            Status status
43        );
44
45    /**
46     * Invoke a command on the node.
47     *
48     * @param cmd Type of the command.
49     * @param param Parameter for the command.
50     * @return status Status of the call.
51     *
52     * @see OMX_SendCommand() in the OpenMax IL standard.
53     */
54    sendCommand(
55            uint32_t cmd,
56            int32_t param
57        ) generates (
58            Status status
59        );
60
61    /**
62     * Retrieve a parameter setting from the node.
63     *
64     * @param index Type of the parameter to retrieve.
65     * @param inParams Information about the retrieval.
66     * @return status Status of the call.
67     * @return outParams Current parameter setting.
68     *
69     * @see OMX_GetParameter() in the OpenMax IL standard.
70     */
71    getParameter(
72            uint32_t index,
73            Bytes inParams
74        ) generates (
75            Status status,
76            Bytes outParams
77        );
78
79    /**
80     * Change a parameter setting of the node.
81     *
82     * @param index Type of the parameter to change.
83     * @param params New parameter setting.
84     * @return status Status of the call.
85     *
86     * @see OMX_SetParameter() in the OpenMax IL standard.
87     */
88    setParameter(
89            uint32_t index,
90            Bytes params
91        ) generates (
92            Status status
93        );
94
95    /**
96     * Retrieve a configuration from the node.
97     *
98     * @param index Type of the configuration to retrieve.
99     * @param inConfig Information about the retrieval.
100     * @return status Status of the call.
101     * @return outConfig Current configuration.
102     *
103     * @see OMX_GetConfig() in the OpenMax IL standard.
104     */
105    getConfig(
106            uint32_t index,
107            Bytes inConfig
108        ) generates (
109            Status status,
110            Bytes outConfig
111        );
112
113    /**
114     * Change a configuration of the node.
115     *
116     * @param index Type of the configuration to change.
117     * @param config New configuration.
118     * @return status Status of the call.
119     *
120     * @see OMX_SetConfig() in the OpenMax IL standard.
121     */
122    setConfig(
123            uint32_t index,
124            Bytes config
125        ) generates (
126            Status status
127        );
128
129    /**
130     * Set the mode of a port on the node.
131     *
132     * @param portIndex Index of the port.
133     * @param mode Target mode on the specified port.
134     * @return status Status of the call.
135     */
136    setPortMode(
137            uint32_t portIndex,
138            PortMode mode
139        ) generates (
140            Status status
141        );
142
143    /**
144     * Prepare a port for adaptive playback. This is based on the extension
145     * "OMX.google.android.index.prepareForAdaptivePlayback".
146     *
147     * @param portIndex Index of the port.
148     * @param enable Whether the adaptive playback is enabled or not.
149     * @param maxFrameWidth Maximum frame width.
150     * @param maxFrameHeight Maximum frame height.
151     * @return status Status of the call.
152     */
153    prepareForAdaptivePlayback(
154            uint32_t portIndex,
155            bool enable,
156            uint32_t maxFrameWidth,
157            uint32_t maxFrameHeight
158        ) generates (
159            Status status
160        );
161
162    /**
163     * Configure a port for a tunneled playback mode. This is based on the
164     * extension "OMX.google.android.index.configureVideoTunnelMode".
165     *
166     * @param portIndex Index of the port.
167     * @param tunneled Whether the tunneled mode is used or not.
168     * @param audioHwSync HW SYNC ID of the audio HAL output stream to sync
169     * the video with.
170     * @return status Status of the call.
171     * @return sidebandHandle Codec-allocated sideband window handle.
172     */
173    configureVideoTunnelMode(
174            uint32_t portIndex,
175            bool tunneled,
176            uint32_t audioHwSync
177        ) generates (
178            Status status,
179            handle sidebandHandle
180        );
181
182    /**
183     * Retrieve the buffer usage on a port. This is based on the extension
184     * "OMX.google.android.index.getAndroidNativeBufferUsage".
185     *
186     * @param portIndex Index of the port.
187     * @return status Status of the call.
188     * @return usage Current graphic buffer usage.
189     */
190    getGraphicBufferUsage(
191            uint32_t portIndex
192        ) generates (
193            Status status,
194            uint32_t usage
195        );
196
197    /**
198     * Set up a listener to events related to the input surface.
199     *
200     * @param bufferSource Listener object that implements
201     * IOmxBufferSource.
202     * @return status Status of the call.
203     *
204     * @see IOmxBufferSource.
205     */
206    setInputSurface(
207            IOmxBufferSource bufferSource
208        ) generates (
209            Status status
210        );
211
212    /**
213     * Allocate an opaque buffer on a port as a native handle.
214     *
215     * @param portIndex Index of the port.
216     * @param size Desired size of the buffer.
217     * @return status Status of the call.
218     * @return buffer Id of the allocated buffer, which will be needed in
219     * other buffer-related functions.
220     * @return nativeHandle Native handle of the allocated buffer.
221     *
222     * @see OMX_AllocateBuffer() in the OpenMax IL standard.
223     */
224    allocateSecureBuffer(
225            uint32_t portIndex,
226            uint64_t size
227        ) generates (
228            Status status,
229            BufferId buffer,
230            handle nativeHandle
231        );
232
233    /**
234     * Assign a buffer to a port.
235     *
236     * @param portIndex Index of the port.
237     * @param omxBuffer Buffer to be assigned to the port.
238     * @return status Status of the call.
239     * @return buffer Id of the assigned buffer, which will be needed in
240     * other buffer-related functions.
241     *
242     * @see OMX_UseBuffer() in the OpenMax IL standard.
243     */
244    useBuffer(
245            uint32_t portIndex,
246            CodecBuffer omxBuffer
247        ) generates (
248            Status status,
249            BufferId buffer
250        );
251
252    /**
253     * Free a buffer previously assigned to a port by allocateSecureBuffer() or
254     * useBuffer().
255     *
256     * @param portIndex Index of the port.
257     * @param buffer Id of the buffer to be freed.
258     * @return status Status of the call.
259     *
260     * @see OMX_FreeBuffer() in the OpenMax IL standard.
261     */
262    freeBuffer(
263            uint32_t portIndex,
264            BufferId buffer
265        ) generates (
266            Status status
267        );
268
269    /**
270     * Pass \p fence to the node if it supports fences. Otherwise, it waits on
271     * \p fence before calling OMX_FillThisBuffer(). The node will take
272     * ownership of the fence even if this call fails.
273     *
274     * If the port is in metadata mode, the buffer will be updated to point to
275     * the new buffer passed in via \p omxBuffer before OMX_FillThisBuffer() is
276     * called. Otherwise, \p omxBuffer is not used.
277     *
278     * @param buffer Id of the buffer to fill.
279     * @param omxBuffer New buffer information (in metadata mode).
280     * @param fence Fence to wait for (if not null).
281     * @return status Status of the call.
282     *
283     * @see OMX_FillThisBuffer() in the OpenMax IL standard.
284     */
285    fillBuffer(
286            BufferId buffer,
287            CodecBuffer omxBuffer,
288            Fence fence
289        ) generates (
290            Status status
291        );
292
293    /**
294     * Pass \p fence to the node if it supports fences. Otherwise, wait on
295     * \p fence before calling OMX_EmptyThisBuffer(). The node will take
296     * ownership of the fence even if this call fails.
297     *
298     * If the port is in metadata mode, the buffer will be updated to point to
299     * the new buffer passed in via \p omxBuffer before OMX_EmptyThisBuffer() is
300     * called. Otherwise, \p omxBuffer is not used.
301     *
302     * @param buffer Id of the buffer to fill.
303     * @param omxBuffer New buffer information (in metadata mode).
304     * @param flags Flags to be passed to OMX_EmptyBuffer().
305     * @param timestampUs Timestamp OMX_EmptyBuffer().
306     * @param fence Fence to wait for (if not null).
307     * @return status Status of the call.
308     *
309     * @see OMX_EmptyThisBuffer() in the OpenMax IL standard.
310     */
311    emptyBuffer(
312            BufferId buffer,
313            CodecBuffer omxBuffer,
314            uint32_t flags,
315            uint64_t timestampUs,
316            Fence fence
317        ) generates (
318            Status status
319        );
320
321    /**
322     * Request the node to translate an extension string to an index.
323     *
324     * @param parameterName Requested extension string.
325     * @return status Status of the call.
326     * @return index Translated index.
327     *
328     * @see OMX_GetExtensionIndex() in the OpenMax IL standard.
329     */
330    getExtensionIndex(
331            string parameterName
332        ) generates (
333            Status status,
334            uint32_t index
335        );
336
337    /**
338     * Add an OMX message on the node's message queue. The instance of
339     * IOmxObserver that was obtained during the creation of the node will
340     * receive the message in batches by the callback
341     * IOmxObserver::onMessages().
342     *
343     * @param msg Message to send.
344     * @return status Status of the call.
345     *
346     * @see IOmxObserver::onMessages().
347     */
348    dispatchMessage(
349            Message msg
350        ) generates (
351            Status status
352        );
353};
354
355