IOMX.h revision c712b9fe2859435ce142b90ddcb46c5bed33eea8
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>
22e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <utils/List.h>
23e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <utils/String8.h>
24e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
25e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <OMX_Core.h>
261de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber#include <OMX_Video.h>
27e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
289f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber#include "jni.h"
299f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber
30e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubernamespace android {
31e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
32e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass IMemory;
33e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass IOMXObserver;
341de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberclass IOMXRenderer;
351de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberclass ISurface;
36ccf8b94169197875af6c89172015b9644919b064Andreas Huberclass Surface;
37e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
38e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass IOMX : public IInterface {
39e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic:
40e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    DECLARE_META_INTERFACE(OMX);
41e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
42e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    typedef void *buffer_id;
43e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    typedef void *node_id;
44e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
45f1fe064d735698b09e4bc7b3a10e4dc3dba9a1d9Andreas Huber    // Given the calling process' pid, returns true iff
46f1fe064d735698b09e4bc7b3a10e4dc3dba9a1d9Andreas Huber    // the implementation of the OMX interface lives in the same
47f1fe064d735698b09e4bc7b3a10e4dc3dba9a1d9Andreas Huber    // process.
48f1fe064d735698b09e4bc7b3a10e4dc3dba9a1d9Andreas Huber    virtual bool livesLocally(pid_t pid) = 0;
49f1fe064d735698b09e4bc7b3a10e4dc3dba9a1d9Andreas Huber
502ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber    struct ComponentInfo {
512ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber        String8 mName;
522ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber        List<String8> mRoles;
532ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber    };
542ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber    virtual status_t listNodes(List<ComponentInfo> *list) = 0;
55e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
56784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t allocateNode(
57784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            const char *name, const sp<IOMXObserver> &observer,
58784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber            node_id *node) = 0;
59e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
60784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t freeNode(node_id node) = 0;
61784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber
62784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t sendCommand(
63e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) = 0;
64e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
65784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t getParameter(
66e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node, OMX_INDEXTYPE index,
67e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            void *params, size_t size) = 0;
68e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
69784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t setParameter(
70e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node, OMX_INDEXTYPE index,
71e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            const void *params, size_t size) = 0;
72e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
73784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t getConfig(
74be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            node_id node, OMX_INDEXTYPE index,
75be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            void *params, size_t size) = 0;
76be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
77784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t setConfig(
78be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            node_id node, OMX_INDEXTYPE index,
79be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            const void *params, size_t size) = 0;
80be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
81784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t useBuffer(
82e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
83e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            buffer_id *buffer) = 0;
84e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
85c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber    // This API clearly only makes sense if the caller lives in the
86c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber    // same process as the callee, i.e. is the media_server, as the
87c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber    // returned "buffer_data" pointer is just that, a pointer into local
88c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber    // address space.
89784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t allocateBuffer(
90e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node, OMX_U32 port_index, size_t size,
91c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber            buffer_id *buffer, void **buffer_data) = 0;
92e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
93784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t allocateBufferWithBackup(
94e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
95e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            buffer_id *buffer) = 0;
96e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
97784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t freeBuffer(
98e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node, OMX_U32 port_index, buffer_id buffer) = 0;
99e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
100784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t fillBuffer(node_id node, buffer_id buffer) = 0;
101e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
102784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t emptyBuffer(
103e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node,
104e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            buffer_id buffer,
105e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 range_offset, OMX_U32 range_length,
106e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 flags, OMX_TICKS timestamp) = 0;
1071de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber
108784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t getExtensionIndex(
109be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            node_id node,
110be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            const char *parameter_name,
111be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            OMX_INDEXTYPE *index) = 0;
112be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
1131de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber    virtual sp<IOMXRenderer> createRenderer(
1141de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber            const sp<ISurface> &surface,
1151de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber            const char *componentName,
1161de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber            OMX_COLOR_FORMATTYPE colorFormat,
1171de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber            size_t encodedWidth, size_t encodedHeight,
1181de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber            size_t displayWidth, size_t displayHeight) = 0;
119ccf8b94169197875af6c89172015b9644919b064Andreas Huber
1209f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber    // Note: These methods are _not_ virtual, it exists as a wrapper around
121ccf8b94169197875af6c89172015b9644919b064Andreas Huber    // the virtual "createRenderer" method above facilitating extraction
1229f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber    // of the ISurface from a regular Surface or a java Surface object.
123ccf8b94169197875af6c89172015b9644919b064Andreas Huber    sp<IOMXRenderer> createRenderer(
124ccf8b94169197875af6c89172015b9644919b064Andreas Huber            const sp<Surface> &surface,
125ccf8b94169197875af6c89172015b9644919b064Andreas Huber            const char *componentName,
126ccf8b94169197875af6c89172015b9644919b064Andreas Huber            OMX_COLOR_FORMATTYPE colorFormat,
127ccf8b94169197875af6c89172015b9644919b064Andreas Huber            size_t encodedWidth, size_t encodedHeight,
128ccf8b94169197875af6c89172015b9644919b064Andreas Huber            size_t displayWidth, size_t displayHeight);
1299f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber
1309f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber    sp<IOMXRenderer> createRendererFromJavaSurface(
1319f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber            JNIEnv *env, jobject javaSurface,
1329f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber            const char *componentName,
1339f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber            OMX_COLOR_FORMATTYPE colorFormat,
1349f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber            size_t encodedWidth, size_t encodedHeight,
1359f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber            size_t displayWidth, size_t displayHeight);
136e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
137e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
138e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberstruct omx_message {
139e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    enum {
140e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        EVENT,
141e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        EMPTY_BUFFER_DONE,
142e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        FILL_BUFFER_DONE,
143e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
144e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    } type;
145e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
146be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    IOMX::node_id node;
147be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
148e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    union {
149e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        // if type == EVENT
150e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        struct {
151e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_EVENTTYPE event;
152e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 data1;
153e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 data2;
154e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        } event_data;
155e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
156329577aa6d422d1dbb33f4771fc5e2949b4ad312Andreas Huber        // if type == EMPTY_BUFFER_DONE
157e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        struct {
158e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            IOMX::buffer_id buffer;
159e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        } buffer_data;
160e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
161329577aa6d422d1dbb33f4771fc5e2949b4ad312Andreas Huber        // if type == FILL_BUFFER_DONE
162e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        struct {
163e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            IOMX::buffer_id buffer;
164e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 range_offset;
165e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 range_length;
166e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 flags;
167e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_TICKS timestamp;
168329577aa6d422d1dbb33f4771fc5e2949b4ad312Andreas Huber            OMX_PTR platform_private;
169e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        } extended_buffer_data;
170e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
171e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    } u;
172e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
173e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
174e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass IOMXObserver : public IInterface {
175e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic:
176e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    DECLARE_META_INTERFACE(OMXObserver);
177e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
178784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual void onMessage(const omx_message &msg) = 0;
179e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
180e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
1811de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberclass IOMXRenderer : public IInterface {
1821de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberpublic:
1831de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber    DECLARE_META_INTERFACE(OMXRenderer);
1841de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber
1851de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber    virtual void render(IOMX::buffer_id buffer) = 0;
1861de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber};
1871de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber
188e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber////////////////////////////////////////////////////////////////////////////////
189e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
190e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass BnOMX : public BnInterface<IOMX> {
191e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic:
192e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual status_t onTransact(
193e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            uint32_t code, const Parcel &data, Parcel *reply,
194e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            uint32_t flags = 0);
195e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
196e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
197e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass BnOMXObserver : public BnInterface<IOMXObserver> {
198e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic:
199e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual status_t onTransact(
200e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            uint32_t code, const Parcel &data, Parcel *reply,
201e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            uint32_t flags = 0);
202e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
203e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
2041de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberclass BnOMXRenderer : public BnInterface<IOMXRenderer> {
2051de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberpublic:
2061de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber    virtual status_t onTransact(
2071de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber            uint32_t code, const Parcel &data, Parcel *reply,
2081de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber            uint32_t flags = 0);
2091de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber};
2101de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber
211e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber}  // namespace android
212e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
213e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#endif  // ANDROID_IOMX_H_
214