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,
11831dc911aee2b50752c0eb7785176075cdaed139cAndreas Huber            size_t displayWidth, size_t displayHeight,
11931dc911aee2b50752c0eb7785176075cdaed139cAndreas Huber            int32_t rotationDegrees) = 0;
120ccf8b94169197875af6c89172015b9644919b064Andreas Huber
1219f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber    // Note: These methods are _not_ virtual, it exists as a wrapper around
122ccf8b94169197875af6c89172015b9644919b064Andreas Huber    // the virtual "createRenderer" method above facilitating extraction
1239f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber    // of the ISurface from a regular Surface or a java Surface object.
124ccf8b94169197875af6c89172015b9644919b064Andreas Huber    sp<IOMXRenderer> createRenderer(
125ccf8b94169197875af6c89172015b9644919b064Andreas Huber            const sp<Surface> &surface,
126ccf8b94169197875af6c89172015b9644919b064Andreas Huber            const char *componentName,
127ccf8b94169197875af6c89172015b9644919b064Andreas Huber            OMX_COLOR_FORMATTYPE colorFormat,
128ccf8b94169197875af6c89172015b9644919b064Andreas Huber            size_t encodedWidth, size_t encodedHeight,
12931dc911aee2b50752c0eb7785176075cdaed139cAndreas Huber            size_t displayWidth, size_t displayHeight,
13031dc911aee2b50752c0eb7785176075cdaed139cAndreas Huber            int32_t rotationDegrees);
1319f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber
1329f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber    sp<IOMXRenderer> createRendererFromJavaSurface(
1339f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber            JNIEnv *env, jobject javaSurface,
1349f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber            const char *componentName,
1359f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber            OMX_COLOR_FORMATTYPE colorFormat,
1369f9afef3d5da3be6812192e60797b1c035445c3cAndreas Huber            size_t encodedWidth, size_t encodedHeight,
13731dc911aee2b50752c0eb7785176075cdaed139cAndreas Huber            size_t displayWidth, size_t displayHeight,
13831dc911aee2b50752c0eb7785176075cdaed139cAndreas Huber            int32_t rotationDegrees);
139e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
140e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
141e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberstruct omx_message {
142e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    enum {
143e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        EVENT,
144e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        EMPTY_BUFFER_DONE,
145e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        FILL_BUFFER_DONE,
146e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
147e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    } type;
148e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
149be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber    IOMX::node_id node;
150be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber
151e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    union {
152e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        // if type == EVENT
153e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        struct {
154e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_EVENTTYPE event;
155e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 data1;
156e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 data2;
157e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        } event_data;
158e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
159329577aa6d422d1dbb33f4771fc5e2949b4ad312Andreas Huber        // if type == EMPTY_BUFFER_DONE
160e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        struct {
161e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            IOMX::buffer_id buffer;
162e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        } buffer_data;
163e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
164329577aa6d422d1dbb33f4771fc5e2949b4ad312Andreas Huber        // if type == FILL_BUFFER_DONE
165e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        struct {
166e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            IOMX::buffer_id buffer;
167e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 range_offset;
168e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 range_length;
169e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_U32 flags;
170e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            OMX_TICKS timestamp;
171329577aa6d422d1dbb33f4771fc5e2949b4ad312Andreas Huber            OMX_PTR platform_private;
17252733b83a736b500f72f72733b06258601c966f8Andreas Huber            OMX_PTR data_ptr;
173e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber        } extended_buffer_data;
174e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
175e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    } u;
176e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
177e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
178e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass IOMXObserver : public IInterface {
179e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic:
180e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    DECLARE_META_INTERFACE(OMXObserver);
181e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
182784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber    virtual void onMessage(const omx_message &msg) = 0;
183e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
184e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
1851de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberclass IOMXRenderer : public IInterface {
1861de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberpublic:
1871de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber    DECLARE_META_INTERFACE(OMXRenderer);
1881de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber
1891de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber    virtual void render(IOMX::buffer_id buffer) = 0;
1901de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber};
1911de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber
192e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber////////////////////////////////////////////////////////////////////////////////
193e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
194e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass BnOMX : public BnInterface<IOMX> {
195e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic:
196e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual status_t onTransact(
197e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            uint32_t code, const Parcel &data, Parcel *reply,
198e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            uint32_t flags = 0);
199e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
200e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
201e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass BnOMXObserver : public BnInterface<IOMXObserver> {
202e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic:
203e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber    virtual status_t onTransact(
204e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            uint32_t code, const Parcel &data, Parcel *reply,
205e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber            uint32_t flags = 0);
206e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber};
207e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
2081de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberclass BnOMXRenderer : public BnInterface<IOMXRenderer> {
2091de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huberpublic:
2101de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber    virtual status_t onTransact(
2111de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber            uint32_t code, const Parcel &data, Parcel *reply,
2121de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber            uint32_t flags = 0);
2131de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber};
2141de13168a9d9f55464dc98748ea28ef785f1048eAndreas Huber
215e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber}  // namespace android
216e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber
217e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#endif  // ANDROID_IOMX_H_
218