IOMX.h revision 387e38dd87ae9c04ef79ebe06ea798762916ff5c
1e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber/*
2e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Copyright (C) 2009 The Android Open Source Project
3e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber *
4e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * you may not use this file except in compliance with the License.
6e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * You may obtain a copy of the License at
7e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber *
8e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber *
10e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Unless required by applicable law or agreed to in writing, software
11e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * See the License for the specific language governing permissions and
14e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * limitations under the License.
15e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber */
16e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
17e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#ifndef ANDROID_IOMX_H_
18e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
19e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#define ANDROID_IOMX_H_
20e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
21e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <binder/IInterface.h>
2233a78149e00806d055ff214d300279963965a677Jamie Gennis#include <ui/GraphicBuffer.h>
23e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <utils/List.h>
24e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <utils/String8.h>
25e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
26e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <OMX_Core.h>
271de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber#include <OMX_Video.h>
28e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
299f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber#include "jni.h"
309f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber
31e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubernamespace android {
32e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
33e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass IMemory;
34e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass IOMXObserver;
351de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberclass IOMXRenderer;
361de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberclass ISurface;
37ccf8b94169197875af6c89172015b9644919b064Andreas Huberclass Surface;
38e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
39e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass IOMX : public IInterface {
40e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic:
41e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    DECLARE_META_INTERFACE(OMX);
42e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
43e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    typedef void *buffer_id;
44e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    typedef void *node_id;
45e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
46f1fe064d735698b09e4bc7b3a10e4dc3dba9a1d9Andreas Huber    // Given the calling process' pid, returns true iff
47f1fe064d735698b09e4bc7b3a10e4dc3dba9a1d9Andreas Huber    // the implementation of the OMX interface lives in the same
48f1fe064d735698b09e4bc7b3a10e4dc3dba9a1d9Andreas Huber    // process.
49f1fe064d735698b09e4bc7b3a10e4dc3dba9a1d9Andreas Huber    virtual bool livesLocally(pid_t pid) = 0;
50f1fe064d735698b09e4bc7b3a10e4dc3dba9a1d9Andreas Huber
512ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber    struct ComponentInfo {
522ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber        String8 mName;
532ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber        List<String8> mRoles;
542ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber    };
552ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber    virtual status_t listNodes(List<ComponentInfo> *list) = 0;
56e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
57784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t allocateNode(
58784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            const char *name, const sp<IOMXObserver> &observer,
59784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            node_id *node) = 0;
60e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
61784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t freeNode(node_id node) = 0;
62784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
63784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t sendCommand(
64e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) = 0;
65e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
66784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t getParameter(
67e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node, OMX_INDEXTYPE index,
68e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            void *params, size_t size) = 0;
69e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
70784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t setParameter(
71e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node, OMX_INDEXTYPE index,
72e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            const void *params, size_t size) = 0;
73e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
74784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t getConfig(
75be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            node_id node, OMX_INDEXTYPE index,
76be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            void *params, size_t size) = 0;
77be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
78784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t setConfig(
79be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            node_id node, OMX_INDEXTYPE index,
80be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            const void *params, size_t size) = 0;
81be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
82387e38dd87ae9c04ef79ebe06ea798762916ff5cJames Dong    virtual status_t storeMetaDataInBuffers(
83387e38dd87ae9c04ef79ebe06ea798762916ff5cJames Dong            node_id node, OMX_U32 port_index, OMX_BOOL enable) = 0;
84387e38dd87ae9c04ef79ebe06ea798762916ff5cJames Dong
8533a78149e00806d055ff214d300279963965a677Jamie Gennis    virtual status_t enableGraphicBuffers(
8633a78149e00806d055ff214d300279963965a677Jamie Gennis            node_id node, OMX_U32 port_index, OMX_BOOL enable) = 0;
8733a78149e00806d055ff214d300279963965a677Jamie Gennis
88784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t useBuffer(
89e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
90e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            buffer_id *buffer) = 0;
91e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
9233a78149e00806d055ff214d300279963965a677Jamie Gennis    virtual status_t useGraphicBuffer(
9333a78149e00806d055ff214d300279963965a677Jamie Gennis            node_id node, OMX_U32 port_index,
9433a78149e00806d055ff214d300279963965a677Jamie Gennis            const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) = 0;
9533a78149e00806d055ff214d300279963965a677Jamie Gennis
96c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber    // This API clearly only makes sense if the caller lives in the
97c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber    // same process as the callee, i.e. is the media_server, as the
98c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber    // returned "buffer_data" pointer is just that, a pointer into local
99c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber    // address space.
100784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t allocateBuffer(
101e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node, OMX_U32 port_index, size_t size,
102c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber            buffer_id *buffer, void **buffer_data) = 0;
103e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
104784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t allocateBufferWithBackup(
105e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
106e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            buffer_id *buffer) = 0;
107e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
108784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t freeBuffer(
109e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node, OMX_U32 port_index, buffer_id buffer) = 0;
110e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
111784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t fillBuffer(node_id node, buffer_id buffer) = 0;
112e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
113784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t emptyBuffer(
114e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node,
115e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            buffer_id buffer,
116e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 range_offset, OMX_U32 range_length,
117e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 flags, OMX_TICKS timestamp) = 0;
1181de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber
119784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t getExtensionIndex(
120be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            node_id node,
121be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            const char *parameter_name,
122be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            OMX_INDEXTYPE *index) = 0;
123be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
1241de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber    virtual sp<IOMXRenderer> createRenderer(
1251de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber            const sp<ISurface> &surface,
1261de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber            const char *componentName,
1271de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber            OMX_COLOR_FORMATTYPE colorFormat,
1281de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber            size_t encodedWidth, size_t encodedHeight,
1291de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber            size_t displayWidth, size_t displayHeight) = 0;
130ccf8b94169197875af6c89172015b9644919b064Andreas Huber
1319f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber    // Note: These methods are _not_ virtual, it exists as a wrapper around
132ccf8b94169197875af6c89172015b9644919b064Andreas Huber    // the virtual "createRenderer" method above facilitating extraction
1339f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber    // of the ISurface from a regular Surface or a java Surface object.
134ccf8b94169197875af6c89172015b9644919b064Andreas Huber    sp<IOMXRenderer> createRenderer(
135ccf8b94169197875af6c89172015b9644919b064Andreas Huber            const sp<Surface> &surface,
136ccf8b94169197875af6c89172015b9644919b064Andreas Huber            const char *componentName,
137ccf8b94169197875af6c89172015b9644919b064Andreas Huber            OMX_COLOR_FORMATTYPE colorFormat,
138ccf8b94169197875af6c89172015b9644919b064Andreas Huber            size_t encodedWidth, size_t encodedHeight,
139ccf8b94169197875af6c89172015b9644919b064Andreas Huber            size_t displayWidth, size_t displayHeight);
1409f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber
1419f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber    sp<IOMXRenderer> createRendererFromJavaSurface(
1429f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber            JNIEnv *env, jobject javaSurface,
1439f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber            const char *componentName,
1449f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber            OMX_COLOR_FORMATTYPE colorFormat,
1459f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber            size_t encodedWidth, size_t encodedHeight,
1469f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber            size_t displayWidth, size_t displayHeight);
147e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
148e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
149e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberstruct omx_message {
150e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    enum {
151e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        EVENT,
152e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        EMPTY_BUFFER_DONE,
153e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        FILL_BUFFER_DONE,
154e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
155e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    } type;
156e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
157be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    IOMX::node_id node;
158be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
159e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    union {
160e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        // if type == EVENT
161e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        struct {
162e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_EVENTTYPE event;
163e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 data1;
164e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 data2;
165e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        } event_data;
166e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
167329577aa6d422d1dbb33f4771fc5e2949b4ad312Andreas Huber        // if type == EMPTY_BUFFER_DONE
168e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        struct {
169e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            IOMX::buffer_id buffer;
170e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        } buffer_data;
171e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
172329577aa6d422d1dbb33f4771fc5e2949b4ad312Andreas Huber        // if type == FILL_BUFFER_DONE
173e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        struct {
174e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            IOMX::buffer_id buffer;
175e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 range_offset;
176e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 range_length;
177e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 flags;
178e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_TICKS timestamp;
179329577aa6d422d1dbb33f4771fc5e2949b4ad312Andreas Huber            OMX_PTR platform_private;
18052733b83a736b500f72f72733b06258601c966f8Andreas Huber            OMX_PTR data_ptr;
181e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        } extended_buffer_data;
182e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
183e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    } u;
184e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
185e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
186e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass IOMXObserver : public IInterface {
187e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic:
188e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    DECLARE_META_INTERFACE(OMXObserver);
189e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
190784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual void onMessage(const omx_message &msg) = 0;
191e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
192e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
1931de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberclass IOMXRenderer : public IInterface {
1941de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberpublic:
1951de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber    DECLARE_META_INTERFACE(OMXRenderer);
1961de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber
1971de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber    virtual void render(IOMX::buffer_id buffer) = 0;
1981de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber};
1991de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber
200e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber////////////////////////////////////////////////////////////////////////////////
201e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
202e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass BnOMX : public BnInterface<IOMX> {
203e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic:
204e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual status_t onTransact(
205e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            uint32_t code, const Parcel &data, Parcel *reply,
206e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            uint32_t flags = 0);
207e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
208e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
209e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass BnOMXObserver : public BnInterface<IOMXObserver> {
210e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic:
211e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual status_t onTransact(
212e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            uint32_t code, const Parcel &data, Parcel *reply,
213e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            uint32_t flags = 0);
214e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
215e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
2161de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberclass BnOMXRenderer : public BnInterface<IOMXRenderer> {
2171de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberpublic:
2181de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber    virtual status_t onTransact(
2191de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber            uint32_t code, const Parcel &data, Parcel *reply,
2201de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber            uint32_t flags = 0);
2211de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber};
2221de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber
223e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber}  // namespace android
224e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
225e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#endif  // ANDROID_IOMX_H_
226