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;
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
816607b39baa05ee85a0857c3f95ff9224517b2abcJamie Gennis    virtual status_t getState(
826607b39baa05ee85a0857c3f95ff9224517b2abcJamie Gennis            node_id node, OMX_STATETYPE* state) = 0;
836607b39baa05ee85a0857c3f95ff9224517b2abcJamie Gennis
84387e38dd87ae9c04ef79ebe06ea798762916ff5cJames Dong    virtual status_t storeMetaDataInBuffers(
85387e38dd87ae9c04ef79ebe06ea798762916ff5cJames Dong            node_id node, OMX_U32 port_index, OMX_BOOL enable) = 0;
86387e38dd87ae9c04ef79ebe06ea798762916ff5cJames Dong
8733a78149e00806d055ff214d300279963965a677Jamie Gennis    virtual status_t enableGraphicBuffers(
8833a78149e00806d055ff214d300279963965a677Jamie Gennis            node_id node, OMX_U32 port_index, OMX_BOOL enable) = 0;
8933a78149e00806d055ff214d300279963965a677Jamie Gennis
90e6befb88bd2ade12c50b0a0e95b209e1f4be94b4Jamie Gennis    virtual status_t getGraphicBufferUsage(
91e6befb88bd2ade12c50b0a0e95b209e1f4be94b4Jamie Gennis            node_id node, OMX_U32 port_index, OMX_U32* usage) = 0;
92e6befb88bd2ade12c50b0a0e95b209e1f4be94b4Jamie Gennis
93784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t useBuffer(
94e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
95e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            buffer_id *buffer) = 0;
96e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
9733a78149e00806d055ff214d300279963965a677Jamie Gennis    virtual status_t useGraphicBuffer(
9833a78149e00806d055ff214d300279963965a677Jamie Gennis            node_id node, OMX_U32 port_index,
9933a78149e00806d055ff214d300279963965a677Jamie Gennis            const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) = 0;
10033a78149e00806d055ff214d300279963965a677Jamie Gennis
101c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber    // This API clearly only makes sense if the caller lives in the
102c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber    // same process as the callee, i.e. is the media_server, as the
103c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber    // returned "buffer_data" pointer is just that, a pointer into local
104c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber    // address space.
105784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t allocateBuffer(
106e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node, OMX_U32 port_index, size_t size,
107c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber            buffer_id *buffer, void **buffer_data) = 0;
108e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
109784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t allocateBufferWithBackup(
110e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
111e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            buffer_id *buffer) = 0;
112e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
113784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t freeBuffer(
114e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node, OMX_U32 port_index, buffer_id buffer) = 0;
115e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
116784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t fillBuffer(node_id node, buffer_id buffer) = 0;
117e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
118784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t emptyBuffer(
119e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            node_id node,
120e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            buffer_id buffer,
121e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 range_offset, OMX_U32 range_length,
122e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 flags, OMX_TICKS timestamp) = 0;
1231de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber
124784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual status_t getExtensionIndex(
125be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            node_id node,
126be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            const char *parameter_name,
127be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber            OMX_INDEXTYPE *index) = 0;
128e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
129e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
130e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberstruct omx_message {
131e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    enum {
132e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        EVENT,
133e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        EMPTY_BUFFER_DONE,
134e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        FILL_BUFFER_DONE,
135e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
136e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    } type;
137e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
138be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    IOMX::node_id node;
139be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
140e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    union {
141e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        // if type == EVENT
142e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        struct {
143e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_EVENTTYPE event;
144e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 data1;
145e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 data2;
146e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        } event_data;
147e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
148329577aa6d422d1dbb33f4771fc5e2949b4ad312Andreas Huber        // if type == EMPTY_BUFFER_DONE
149e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        struct {
150e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            IOMX::buffer_id buffer;
151e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        } buffer_data;
152e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
153329577aa6d422d1dbb33f4771fc5e2949b4ad312Andreas Huber        // if type == FILL_BUFFER_DONE
154e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        struct {
155e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            IOMX::buffer_id buffer;
156e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 range_offset;
157e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 range_length;
158e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 flags;
159e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_TICKS timestamp;
160329577aa6d422d1dbb33f4771fc5e2949b4ad312Andreas Huber            OMX_PTR platform_private;
16152733b83a736b500f72f72733b06258601c966f8Andreas Huber            OMX_PTR data_ptr;
162e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        } extended_buffer_data;
163e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
164e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    } u;
165e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
166e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
167e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass IOMXObserver : public IInterface {
168e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic:
169e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    DECLARE_META_INTERFACE(OMXObserver);
170e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
171784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual void onMessage(const omx_message &msg) = 0;
172e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
173e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
174e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber////////////////////////////////////////////////////////////////////////////////
175e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
176e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass BnOMX : public BnInterface<IOMX> {
177e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic:
178e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual status_t onTransact(
179e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            uint32_t code, const Parcel &data, Parcel *reply,
180e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            uint32_t flags = 0);
181e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
182e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
183e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass BnOMXObserver : public BnInterface<IOMXObserver> {
184e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic:
185e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual status_t onTransact(
186e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            uint32_t code, const Parcel &data, Parcel *reply,
187e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            uint32_t flags = 0);
188e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
189e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
190fbb170ca9cbbd0c87c71ac39ecbb36086bca5ee2James Dongstruct CodecProfileLevel {
191fbb170ca9cbbd0c87c71ac39ecbb36086bca5ee2James Dong    OMX_U32 mProfile;
192fbb170ca9cbbd0c87c71ac39ecbb36086bca5ee2James Dong    OMX_U32 mLevel;
193fbb170ca9cbbd0c87c71ac39ecbb36086bca5ee2James Dong};
194fbb170ca9cbbd0c87c71ac39ecbb36086bca5ee2James Dong
195e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber}  // namespace android
196e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
197e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#endif  // ANDROID_IOMX_H_
198